Для Elasticsearch 6.5.4 и более поздних версий Open Distro for Elasticsearch SQL позволяет писать запросы на SQL вместо языка запросов Elasticsearch, специфичного для домена (DSL).
Пользователи, знакомые с SQL, могут использовать SQL для поиска данных в кластерах Elasticsearch.
Пример использования SQL
- Используйте SQL для поиска данных в Kibana (рекомендовано).
Войдите в Kibana и, на Инструменты разработки странице, отправляйте запросы, используя параметры запроса или тело запроса к _opendistro/_sql.
Например, выполните следующую команду, чтобы получить 50 записей из my-index индекс:
1234POST _opendistro/_sql{"query": "SELECT * FROM my-index LIMIT 50"}По умолчанию результат запроса возвращается в формате JSON. Чтобы вернуть данные в формате CSV, установите format параметр в команде следующим образом:
1234POST _opendistro/_sql?format=csv{"query": "SELECT * FROM my-index LIMIT 50"}Когда результат запроса возвращается в формате CSV, каждая строка соответствует документу, а каждый столбец соответствует полю.
- Выполняйте команды cURL на ECS для выполнения SQL‑запросов по поиску данных.
Например, выполните следующую команду, чтобы получить 10 записей из kibana_sample_data_flights индекс.
curl -XPOST https://localhost:9200/_opendistro/_sql -u username:password -k -d '{"query": "SELECT * FROM kibana_sample_data_flights LIMIT 10"}' -H 'Content-Type: application/json'localhost указывает адрес доступа к кластеру. имя пользователя и пароль укажите имя пользователя и пароль для доступа к кластеру security-mode, соответственно.
Поддерживаемые SQL операции
Open Distro for Elasticsearch поддерживает следующие SQL операции: операторы, условия, агрегаты, включаемые и исключаемые поля, общие функции, соединения и show.
- Операторы
Таблица 1 Операторы Оператор
Пример
Select
SELECT * FROM my-index
Delete
DELETE FROM my-index WHERE _id=1
Where
SELECT * FROM my-index WHERE ['field']='value'
Order by
SELECT * FROM my-index ORDER BY _id asc
Group by
SELECT * FROM my-index GROUP BY range(age, 20,30,39)
Лимит
SELECT * FROM my-index LIMIT 50 (default is 200)
Объединение
SELECT * FROM my-index1 UNION SELECT * FROM my-index2
Разность
SELECT * FROM my-index1 MINUS SELECT * FROM my-index2
NoteКак и любой сложный запрос, крупные операторы UNION и MINUS могут перегрузить или даже вывести из строя ваш кластер.
- Условия
Таблица 2 Условия Условие
Пример
LIKE
SELECT * FROM my-index WHERE name LIKE 'j%'
AND
SELECT * FROM my-index WHERE name LIKE 'j%' AND age > 21
OR
SELECT * FROM my-index WHERE name LIKE 'j%' OR age > 21
Подсчет уникальных
SELECT count(distinct age) FROM my-index
IN
SELECT * FROM my-index WHERE name IN ('alejandro', 'carolina')
NOT
SELECT * FROM my-index WHERE name NOT IN ('jane')
BETWEEN
SELECT * FROM my-index WHERE age BETWEEN 20 AND 30
Псевдонимы
SELECT avg(age) AS Average_Age FROM my-index
Дата
SELECT * FROM my-index WHERE birthday='1990-11-15'
NULL
SELECT * FROM my-index WHERE name IS NULL
- Агрегации
Таблица 3 Агрегации Агрегация
Пример
avg()
SELECT avg(age) FROM my-index
count()
SELECT count(age) FROM my-index
max()
SELECT max(age) AS Highest_Age FROM my-index
min()
SELECT min(age) AS Lowest_Age FROM my-index
sum()
SELECT sum(age) AS Age_Sum FROM my-index
- Включить и исключить поля
Таблица 4 Включить и исключить поля Шаблон
Пример
include()
SELECT include('a*'), exclude('age') FROM my-index
exclude()
SELECT exclude('*name') FROM my-index
- Функции
Таблица 5 Функции Функция
Пример
floor
SELECT floor(number) AS Rounded_Down FROM my-index
trim
SELECT trim(name) FROM my-index
log
SELECT log(number) FROM my-index
log10
SELECT log10(number) FROM my-index
substring
SELECT substring(name, 2,5) FROM my-index
round
SELECT round(number) FROM my-index
sqrt
SELECT sqrt(number) FROM my-index
concat_ws
SELECT concat_ws(' ', age, height) AS combined FROM my-index
/
SELECT number / 100 FROM my-index
%
SELECT number % 100 FROM my-index
date_format
SELECT date_format(date, 'Y') FROM my-index
NoteНеобходимо включить fielddata в сопоставлении документа, чтобы большинство строковых функций работали корректно.
- Соединения
Таблица 6 Соединения Соединение
Пример
Внутреннее соединение
SELECT s.firstname, s.lastname, s.gender, sc.name FROM student s JOIN school sc ON sc.name = s.school_name WHERE s.age > 20
Левое внешнее соединение
SELECT s.firstname, s.lastname, s.gender, sc.name FROM student s LEFT JOIN school sc ON sc.name = s.school_name
Кросс‑соединение
SELECT s.firstname, s.lastname, s.gender, sc.name FROM student s CROSS JOIN school sc
Для получения подробной информации об ограничениях см. Соединения.
- Показать
Команды Show отображают индексы и сопоставления, которые соответствуют шаблону индекса. Вы можете использовать * или % для подстановочных знаков.
Таблица 7 Показать Показать
Пример
SHOW tables like
SHOW TABLES LIKE logs-*
Соединения
Open Distro for Elasticsearch SQL поддерживает внутренние соединения, left outer соединения и cross соединения. Соединения имеют следующие ограничения:
- Можно объединять только два индекса.
- Необходимо использовать псевдоним для индекса (например, people p).
- В операторе ON можно использовать только условия AND.
- В операторе WHERE не объединяйте деревья, содержащие несколько индексов. Например, следующее выражение будет работать:WHERE (a.type1 > 3 OR a.type1 < 0) AND (b.type2 > 4 OR b.type2 < -1)
Следующее выражение не будет работать:
WHERE (a.type1 > 3 OR b.type2 < 0) AND (a.type1 > 4 OR b.type2 < -1)
- Вы не можете использовать GROUP BY или ORDER BY для получения результатов.
- LIMIT с OFFSET (например, LIMIT 25 OFFSET 25) не поддерживается.
JDBC драйвер
Java Database Connectivity (JDBC) драйвер позволяет интегрировать Open Distro for Elasticsearch с вашими приложениями бизнес‑аналитики (BI).
Для получения подробной информации о том, как загружать и использовать JAR‑файлы, см. GitHub репозитории.