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