Облачная платформаAdvanced

Использование SQL для поиска данных в Elasticsearch

Эта статья полезна?
Язык статьи: Русский
Показать оригинал
Страница переведена автоматически и может содержать неточности. Рекомендуем сверяться с английской версией.

Для Elasticsearch 6.5.4 и более поздних версий Open Distro for Elasticsearch SQL позволяет писать запросы на SQL вместо языка запросов Elasticsearch, специфичного для домена (DSL).

Пользователи, знакомые с SQL, могут использовать SQL для поиска данных в кластерах Elasticsearch.

Пример использования SQL

  • Используйте SQL для поиска данных в Kibana (рекомендовано).

    Войдите в Kibana и, на Инструменты разработки странице, отправляйте запросы, используя параметры запроса или тело запроса к _opendistro/_sql.

    Например, выполните следующую команду, чтобы получить 50 записей из my-index индекс:

    1
    2
    3
    4POST _opendistro/_sql
    {
    "query": "SELECT * FROM my-index LIMIT 50"
    }

    По умолчанию результат запроса возвращается в формате JSON. Чтобы вернуть данные в формате CSV, установите format параметр в команде следующим образом:

    1
    2
    3
    4POST _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 репозитории.