Для разработчиков и аналитиков данных, знакомых с реляционными базами данных, такими как MySQL, нативный, основанный на JSON запрос DSL OpenSearch может представлять крутой порог обучения. В частности, построение сложных запросов агрегации может быть подвержено ошибкам. Чтобы решить эту проблему, кластеры CSS OpenSearch интегрируют плагин Open Distro for OpenSearch SQL. Этот плагин позволяет пользователям выполнять запросы, агрегировать и анализировать данные в OpenSearch, используя стандартный синтаксис SQL. Он также поддерживает взаимодействие с популярными BI‑инструментами, такими как Tableau, через драйвер JDBC, обеспечивая бесшовный опыт исследования данных.
Open Distro for OpenSearch SQL по сути является транслятором между SQL и OpenSearch DSL. Он работает следующим образом:
Для получения дополнительной информации см. SQL Functions.
Используйте этот метод для разработки, отладки и разовых запросов.
Например, выполните следующую команду для поиска в индексе my-index документов, где поле age превышает 20, возвращая до 10 результатов:
Например, выполните следующую команду, чтобы получить 10 документов из индекса my-index на основе полей name и age и вернуть результаты в формате CSV:
POST _opendistro/_sql?format=csv{"query": "SELECT name, age FROM my-index LIMIT 10"}
Например, выполните следующую команду, чтобы преобразовать запрос SQL в эквивалентный запрос DSL:
Используйте этот метод, когда необходимо включить запросы OpenSearch в автоматизированные скрипты или запланированные задачи.
Например, выполните следующую команду, чтобы получить 10 записей из индекса my-index. Ниже приведён пример кода, используемого в кластере в режиме security-mode, который использует HTTP:
curl -XPOST http://<cluster IP address>:9200/_opendistro/_sql \-u <username>:<password> -k \-H 'Content-Type: application/json' \-d '{"query": "SELECT * FROM my-index LIMIT 10"}'
Open Distro for Elasticsearch SQL поддерживает следующие элементы синтаксиса SQL: операторы, условия, агрегаты, поля include и exclude, общие функции, соединения и операторы SHOW.
Оператор | Пример |
|---|---|
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) |
Limit | SELECT * FROM my-index LIMIT 50 (default is 200) |
Union | SELECT * FROM my-index1 UNION SELECT * FROM my-index2 |
Minus | SELECT * FROM my-index1 MINUS SELECT * FROM my-index2 |
Большие запросы UNION и MINUS могут приводить к высокому потреблению ресурсов, что потенциально приводит к ухудшению производительности кластера или даже к перебоям в работе сервиса. Чтобы снизить этот риск, рекомендуется оптимизировать структуру запросов или разбить большие запросы на более мелкие партии.
Условие | Пример |
|---|---|
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 |
Count distinct | SELECT count(distinct age) FROM my-index |
In | SELECT * FROM my-index WHERE name IN ('Bob', 'David') |
Not | SELECT * FROM my-index WHERE name NOT IN ('Bob') |
Между | 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 |
Агрегация | Пример |
|---|---|
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 |
Шаблон | Пример |
|---|---|
include() | SELECT include('a*'), exclude('age') FROM my-index |
exclude() | SELECT exclude('*name') FROM my-index |
Необходимо включить fielddata в сопоставлении документа, чтобы большинство строковых функций работали корректно.
Функция | Пример |
|---|---|
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 |
Поддерживаемые типы соединений: INNER JOIN, LEFT JOIN и CROSS JOIN.
Жёсткие ограничения: Положительный пример: Отрицательный пример:
Join | Example |
|---|---|
Inner join | 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 |
Left outer join | SELECT s.firstname, s.lastname, s.gender, sc.name FROM student s LEFT JOIN school sc ON sc.name = s.school_name |
Cross join | SELECT s.firstname, s.lastname, s.gender, sc.name FROM student s CROSS JOIN school sc |
Show commands display indexes and mappings that match an index pattern. You can use * or % for wildcards.
Show | Пример |
|---|---|
Показать таблицы, похожие на | SHOW TABLES LIKE logs-* |
Если вы используете Tableau, Power BI или собственное Java‑приложение, вы можете подключиться к кластеру CSS с помощью JDBC driver.
Скачайте JDBC driver из GitHub repository.