Elasticsearch официально поддерживает SQL-запросы, что очень удобно!

Java Elasticsearch
Elasticsearch официально поддерживает SQL-запросы, что очень удобно!

Адрес фактического центра электронной коммерции SpringBoot (40k+star):GitHub.com/macro-positive/…

Резюме

Когда я обычно использую Elasticsearch, я иногда использую Query DSL в Kibana для запроса данных. Каждый раз, когда я использую Query DSL, я в основном забываю об этом, и мне нужно просмотреть его снова. Недавно я обнаружил, что Elasticsearch уже поддерживает SQL-запрос (после версии 6.3), и я разобрался с его использованием. Надеюсь, это будет полезно все!

Введение

Elasticsearch SQL — это компонент X-Pack, который позволяет выполнять SQL-подобные запросы к Elasticsearch в реальном времени. Независимо от того, используете ли вы интерфейс REST, командную строку или JDBC, любой клиент может использовать SQL для естественного поиска и агрегирования данных в Elasticsearch. Думайте об Elasticsearch SQL как о своего рода трансляторе, который переводит SQL в Query DSL.

Elasticsearch SQL имеет следующие особенности:

  • Встроенная поддержка: Elasticsearch SQL создан специально для Elasticsearch.
  • Никаких дополнительных частей: Elasticsearch можно запрашивать без дополнительного оборудования, процессоров, сред выполнения или зависимых библиотек, а Elasticsearch SQL запускается непосредственно внутри Elasticsearch.
  • Легкий и эффективный: Elasticsearch SQL не абстрагируется от своей функции поиска, вместо этого он включает и принимает SQL для полнотекстового поиска, выполняя полнотекстовый поиск в режиме реального времени в сжатой форме.

дошкольная подготовка

Прежде чем учиться, нам нужно сначала понять Elasticsearch и установить Elasticsearch и Kibana.Версия 7.6.2 установлена ​​здесь.Подробности см.«Быстрый старт Elasticsearch, просто освойте их! 》.

После завершения установки импортируйте тестовые данные в Kibana, адрес данных:GitHub.com/macro-positive/…

Просто запустите следующую команду прямо в Kibana Dev Tools:

первый SQL-запрос

Мы используем SQL для запроса первых 10 записей, что можно сделать с помощьюformatПараметр управляет форматом возвращаемого результата. txt представляет собой текстовый формат, который выглядит более интуитивно понятным. По умолчанию используется формат json.

Введите следующую команду в консоли Kibana:

POST /_sql?format=txt
{
  "query": "SELECT account_number,address,age,balance FROM account LIMIT 10"
}

Результаты запроса отображаются следующим образом.

Преобразование SQL в DSL

Когда нам нужно использовать Query DSL, мы также можем сначала использовать SQL для запроса, а затем преобразовать его через Translate API.

Например, мы переводим следующий запрос:

POST /_sql/translate
{
  "query": "SELECT account_number,address,age,balance FROM account WHERE age>32 LIMIT 10"
}

Окончательные полученные результаты Query DSL следующие.

Смешивание SQL и DSL

Мы также можем смешивать SQL и Query DSL, например, использовать Query DSL для установки условий фильтрации.

Например, чтобы запросить записи, возраст которых составляет от 30 до 35 лет, вы можете использовать следующий оператор запроса:

POST /_sql?format=txt
{
  "query": "SELECT account_number,address,age,balance FROM account",
      "filter": {
        "range": {
            "age": {
                "gte" : 30,
                "lte" : 35
            }
        }
    },
    "fetch_size": 10
}

Результаты запроса отображаются следующим образом:

Соответствие SQL и ES

SQL ES описывать
column field Поля таблицы в базе соответствуют свойствам в ES
row document Записи строк в таблице БД соответствуют документам в ЭП
table index Таблицы в базе соответствуют индексам в ES

Общие операции SQL

грамматика

Синтаксис использования SQL-запроса в ES в основном такой же, как и в базе данных.Специфический формат выглядит следующим образом:

SELECT select_expr [, ...]
[ FROM table_name ]
[ WHERE condition ]
[ GROUP BY grouping_element [, ...] ]
[ HAVING condition]
[ ORDER BY expression [ ASC | DESC ] [, ...] ]
[ LIMIT [ count ] ]
[ PIVOT ( aggregation_expr FOR column IN ( value [ [ AS ] alias ] [, ...] ) ) ]

WHERE

можно использоватьWHEREОператор устанавливает условия запроса, такие как запрос записей, поле состояния которых имеет значение VA.

POST /_sql?format=txt
{
  "query": "SELECT account_number,address,age,balance,state FROM account WHERE state='VA' LIMIT 10 "
}

Результаты запроса отображаются следующим образом:

GROUP BY

мы можем использоватьGROUP BYОператор группирует данные и подсчитывает количество сгруппированных записей, максимальный возраст и средний баланс и другую информацию.Инструкция запроса выглядит следующим образом.

POST /_sql?format=txt
{
  "query": "SELECT state,COUNT(*),MAX(age),AVG(balance) FROM account GROUP BY state LIMIT 10"
}

HAVING

мы можем использоватьHAVINGОператор выполняет вторичную фильтрацию сгруппированных данных, например фильтрацию информации, число сгруппированных записей которой превышает 15. Оператор запроса выглядит следующим образом.

POST /_sql?format=txt
{
  "query": "SELECT state,COUNT(*),MAX(age),AVG(balance) FROM account GROUP BY state HAVING COUNT(*)>15 LIMIT 10"
}

ORDER BY

мы можем использоватьORDER BYОператор сортирует данные, например, по полю баланса от высокого к низкому, оператор запроса выглядит следующим образом.

POST /_sql?format=txt
{
  "query": "SELECT account_number,address,age,balance,state FROM account ORDER BY balance DESC LIMIT 10 "
}

DESCRIBE

мы можем использоватьDESCRIBEОператор проверяет, какие поля находятся в таблице (индекс в ES), например, просмотр полей таблицы счетов, оператор запроса выглядит следующим образом.

POST /_sql?format=txt
{
  "query": "DESCRIBE account"
}

SHOW TABLES

мы можем использоватьSHOW TABLESПосмотреть все таблицы (индексы в ES).

POST /_sql?format=txt
{
  "query": "SHOW TABLES"
}

Поддерживаемые функции

Для запроса данных в ES с помощью SQL можно использовать не только некоторые функции в SQL, но и некоторые функции, уникальные для ES.

Функции, поддерживаемые запросом

мы можем использоватьSHOW FUNCTIONSоператор для просмотра всех поддерживаемых функций, таких как поиск всех функций с помощьюDATEФункция поля может использовать следующий оператор.

POST /_sql?format=txt
{
  "query": "SHOW FUNCTIONS LIKE '%DATE%'"
}

Функция полнотекстового поиска

Функция полнотекстового поиска специфична для ES, при использованииMATCHилиQUERYфункция, функция полнотекстового поиска включена,SCOREФункции можно использовать для подсчета результатов поиска.

MATCH()

использоватьMATCHФункция запрашивает записи, содержащие улицу в адресе.

POST /_sql?format=txt
{
  "query": "SELECT account_number,address,age,balance,SCORE() FROM account WHERE MATCH(address,'Street') LIMIT 10"
}

QUERY()

использоватьQUERYФункция запрашивает записи, содержащие улицу в адресе.

POST /_sql?format=txt
{
  "query": "SELECT account_number,address,age,balance,SCORE() FROM account WHERE QUERY('address:Street') LIMIT 10"
}

SQL CLI

Если вы не хотите использовать Kibana для использования ES SQL, вы также можете использовать SQL CLI, который поставляется с ES для запроса.Эта команда находится в каталоге bin ES.

Запустите интерфейс командной строки SQL с помощью следующей команды:

elasticsearch-sql-cli http://localhost:9200

Затем непосредственно введите команду SQL для запроса, обратите внимание на добавление точки с запятой.

SELECT account_number,address,age,balance FROM account LIMIT 10;

ограничение

Использование SQL для запроса ES имеет определенные ограничения: он не такой мощный, как родной Query DSL, а поддержка вложенных атрибутов и некоторых функций не очень хороша, но в принципе достаточна для запроса данных.

использованная литература

Официальная документация:woohoo.elastic.co/expensive/en/bad…

Эта статьяGitHubGitHub.com/macro-positive/…Записано, приветствую всех на Star!