Адрес фактического центра электронной коммерции 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!