Команды ES|QL
Команды обработки
Команды обработки ES|QL изменяют входную таблицу, добавляя, удаляя или изменяя строки и столбцы.
ES|QL поддерживает следующие команды обработки:
-
DISSECT -
DROP -
ENRICH -
EVAL -
GROK -
KEEP -
LIMIT - [предварительный просмотр] Данная функциональность находится в стадии технического предварительного просмотра и может быть изменена или удалена в будущих выпусках. Elastic будет работать над устранением любых проблем, но функции в стадии технического предварительного просмотра не подпадают под SLA поддержки официальных функций GA.
MV_EXPAND -
RENAME -
SORT -
STATS -
WHERE
FROM
Команда источника FROM возвращает таблицу с данными из потока данных, индекса или псевдонима.
Синтаксис
FROM index_pattern [METADATA fields]
Параметры
-
index_pattern - Список индексов, потоков данных или псевдонимов. Поддерживаются подстановочные знаки и математика дат.
-
fields - Список полей метаданных, разделенных запятыми, для извлечения.
Описание
Команда источника FROM возвращает таблицу с данными из потока данных, индекса или псевдонима. Каждая строка в результирующей таблице представляет документ. Каждый столбец соответствует полю и может быть обращен по имени этого поля.
По умолчанию запрос ES|QL без явного использования LIMIT использует неявное ограничение в 1000. Это относится и к FROM. Команда FROM без LIMIT:
FROM employees
выполняется как:
FROM employees | LIMIT 1000
Примеры
FROM employees
Для ссылки на индексы, псевдонимы и потоки данных можно использовать математику дат. Это может быть полезно для данных временных рядов, например, для доступа к индексу сегодняшнего дня:
FROM <logs-{now/d}> Используйте списки, разделенные запятыми, или подстановочные знаки для запроса к нескольким потокам данных, индексам или псевдонимам:
FROM employees-00001,other-employees-*
Используйте формат <remote_cluster_name>:<target> для запроса к потокам данных и индексам на удаленных кластерах:
FROM cluster_one:employees-00001,cluster_two:other-employees-*
Используйте необязательную директиву METADATA для включения полей метаданных:
FROM employees METADATA _id
Используйте двойные кавычки (") или тройные двойные кавычки (""") для экранирования имён индексов, содержащих специальные символы:
FROM "this=that", """this[that"""
ROW
Команда источника ROW создает строку с одним или несколькими столбцами, значения которых вы указываете. Это может быть полезно для тестирования.
Синтаксис
ROW column1 = value1[, ..., columnN = valueN]
Параметры
-
columnX - Название столбца. В случае дублирования имён столбцов, создается только столбец с последним дублированным именем.
-
valueX - Значение для столбца. Может быть литералом, выражением или функцией.
Примеры
ROW a = 1, b = "two", c = null
| a:integer | b:keyword | c:null |
|---|---|---|
1 | "two" | null |
Используйте квадратные скобки для создания столбцов с несколькими значениями:
ROW a = [2, 1]
ROW поддерживает использование функций:
ROW a = ROUND(1.23, 0)
SHOW
Команда источника SHOW возвращает информацию о развертывании и его возможностях.
Синтаксис
SHOW item
Параметры
-
item - Может быть только
INFO.
Примеры
Используйте SHOW INFO для получения версии развертывания, даты сборки и хэша.
SHOW INFO
| version | date | hash |
|---|---|---|
8.13.0 | 2024-02-23T10:04:18.123117961Z | 04ba8c8db2507501c88f215e475de7b0798cb3b3 |
DISSECT
DISSECT позволяет извлекать структурированные данные из строки.
Синтаксис
DISSECT input "pattern" [APPEND_SEPARATOR="<separator>"]
Параметры
-
input - Столбец, содержащий строку, которую нужно структурировать. Если столбец содержит несколько значений,
DISSECTобработает каждое значение. -
pattern - шаблон dissect. Если имя поля совпадает с существующим столбцом, существующий столбец удаляется. Если имя поля используется более одного раза, создается столбец только с последним дублированным именем.
-
<separator> - Строка, используемая в качестве разделителя между добавленными значениями при использовании модификатора добавления.
Описание
DISSECT позволяет извлекать структурированные данные из строки. DISSECT сопоставляет строку с шаблоном, основанным на разделителях, и извлекает указанные ключи в качестве столбцов.
Обратитесь к разделу Обработка данных с помощью DISSECT для синтаксиса шаблонов dissect.
Примеры
Следующий пример анализирует строку, содержащую метку времени, некоторый текст и IP-адрес:
ROW a = "2023-01-23T12:15:00.000Z - some text - 127.0.0.1"
| DISSECT a """%{date} - %{msg} - %{ip}"""
| KEEP date, msg, ip | date:keyword | msg:keyword | ip:keyword |
|---|---|---|
2023-01-23T12:15:00.000Z | some text | 127.0.0.1 |
По умолчанию DISSECT выводит столбцы строк типа keyword. Для преобразования в другой тип используйте функции преобразования типов:
ROW a = "2023-01-23T12:15:00.000Z - some text - 127.0.0.1"
| DISSECT a """%{date} - %{msg} - %{ip}"""
| KEEP date, msg, ip
| EVAL date = TO_DATETIME(date) | msg:keyword | ip:keyword | date:date |
|---|---|---|
некоторые текст | 127.0.0.1 | 2023-01-23T12:15:00.000Z |
DROP
Команда обработки DROP удаляет одну или несколько колонок.
Синтаксис
DROP columns
Параметры
-
columns - Список колонок, разделенных запятыми, для удаления. Поддерживаются подстановочные знаки.
Примеры
FROM employees | DROP height
Вместо указания каждой колонки по имени, можно использовать подстановочные знаки для удаления всех колонок с именем, соответствующим шаблону:
FROM employees | DROP height*
ENRICH
ENRICH позволяет добавлять данные из существующих индексов в качестве новых колонок с помощью политики обогащения.
Синтаксис
ENRICH policy [ON match_field] [WITH [new_name1 = ]field1, [new_name2 = ]field2, ...]
Параметры
-
policy - Имя политики обогащения. Вам необходимо предварительно создать и выполнить политику обогащения.
-
mode - Режим команды обогащения в кросс-кластерном ES|QL. См. обогащение по кластерам.
-
match_field - Поле соответствия.
ENRICHиспользует его значение для поиска записей в индексе обогащения. Если не указано, сопоставление будет выполнено по колонке с тем же именем, что иmatch_field, определенное в политике обогащения. -
fieldX - Поля обогащения из индекса обогащения, которые добавляются в результат в качестве новых колонок. Если колонка с таким же именем, что и поле обогащения, уже существует, существующая колонка будет заменена новой. Если не указано, добавляется каждое из определённых в политике полей обогащения. Колонка с тем же именем, что и поле обогащения, будет удалена, если поле обогащения не переименовано.
-
new_nameX - Позволяет изменить имя колонки, добавляемой для каждого поля обогащения. По умолчанию используется имя поля обогащения. Если колонка имеет такое же имя, как новое имя, она будет удалена. Если имя (новое или оригинальное) встречается более одного раза, только правое дублирование создает новую колонку.
Описание
ENRICH позволяет добавлять данные из существующих индексов в качестве новых колонок с помощью политики обогащения. См. Обогащение данных для получения информации о настройке политики.
Перед использованием ENRICH необходимо создать и выполнить политику обогащения.
Примеры
В следующем примере используется политика обогащения languages_policy для добавления новой колонки для каждого поля обогащения, определенного в политике. Сопоставление выполняется с помощью match_field, определённого в политике обогащения, и требует, чтобы входная таблица имела колонку с тем же именем (language_code в этом примере). ENRICH будет искать записи в индексе обогащения на основе значения поля соответствия.
ROW language_code = "1" | ENRICH languages_policy
| language_code:keyword | language_name:keyword |
|---|---|
1 | Английский |
Чтобы использовать колонку с другим именем, чем match_field, определенное в политике, в качестве поля соответствия, используйте ON <column-name>:
ROW a = "1" | ENRICH languages_policy ON a
| a:keyword | language_name:keyword |
|---|---|
1 | Английский |
По умолчанию каждое из определенных в политике полей обогащения добавляется как колонка. Для явного выбора полей обогащения, которые добавляются, используйте WITH <field1>, <field2>, ...:
ROW a = "1" | ENRICH languages_policy ON a WITH language_name
| a:keyword | language_name:keyword |
|---|---|
1 | Английский |
Можно переименовать добавляемые колонки, используя WITH new_name=<field1>:
ROW a = "1" | ENRICH languages_policy ON a WITH name = language_name
| a:keyword | name:keyword |
|---|---|
1 | Английский |
В случае коллизии имен, новые колонки переопределяют существующие.
EVAL
Команда обработки EVAL позволяет добавлять новые колонки с вычисленными значениями.
Синтаксис
EVAL [column1 =] value1[, ..., [columnN =] valueN]
Параметры
-
columnX - Имя колонки. Если колонка с таким же именем уже существует, существующая колонка удаляется. Если имя колонки используется более одного раза, только правое дублирование создает колонку.
-
valueX - Значение для колонки. Может быть литералом, выражением или функцией. Можно использовать колонки, определённые слева от этой.
Описание
Команда обработки EVAL позволяет добавлять новые колонки с вычисленными значениями. EVAL поддерживает различные функции для вычисления значений. См. Функции для получения дополнительной информации.
Примеры
FROM employees | SORT emp_no | KEEP first_name, last_name, height | EVAL height_feet = height * 3.281, height_cm = height * 100
| first_name:keyword | last_name:keyword | height:double | height_feet:double | height_cm:double |
|---|---|---|---|---|
Georgi | Facello | 2.03 | 6.66043 | 202.99999999999997 |
Bezalel | Simmel | 2.08 | 6.82448 | 208.0 |
Parto | Bamford | 1.83 | 6.004230000000001 | 183.0 |
Если указанная колонка уже существует, существующая колонка будет удалена, а новая колонка будет добавлена в таблицу:
FROM employees | SORT emp_no | KEEP first_name, last_name, height | EVAL height = height * 3.281
| first_name:keyword | last_name:keyword | height:double |
|---|---|---|
Georgi | Facello | 6.66043 |
Bezalel | Simmel | 6.82448 |
Parto | Bamford | 6.004230000000001 |
Указание имени выходной колонки необязательно. Если не указано, имя новой колонки равно выражению. Следующий запрос добавляет колонку, названную height*3.281:
FROM employees | SORT emp_no | KEEP first_name, last_name, height | EVAL height * 3.281
| first_name:keyword | last_name:keyword | height:double | height * 3.281:double |
|---|---|---|---|
Георги | Фачелло | 2.03 | 6.66043 |
Бецалель | Симмель | 2.08 | 6.82448 |
Парто | Бэмфорд | 1.83 | 6.004230000000001 |
Поскольку это имя содержит специальные символы, его необходимо заключить в кавычки с использованием обратных кавычек (`) при использовании в последующих командах:
FROM employees | EVAL height * 3.281 | STATS avg_height_feet = AVG(`height * 3.281`)
| avg_height_feet:double |
|---|
5.801464200000001 |
GROK
GROK позволяет извлекать структурированные данные из строки.
Синтаксис
GROK input "pattern"
Параметры
-
input - Столбец, содержащий строку, которую требуется структурировать. Если столбец содержит несколько значений,
GROKобработает каждое значение. -
pattern - Шаблон grok. Если имя поля конфликтует с существующим столбцом, существующий столбец отбрасывается. Если имя поля используется более одного раза, будет создан столбец с несколькими значениями, по одному значению на каждое вхождение имени поля.
Описание
GROK позволяет извлекать структурированные данные из строки. GROK сопоставляет строку с шаблонами на основе регулярных выражений и извлекает указанные шаблоны в виде столбцов.
Обратитесь к разделу "Обработка данных с помощью GROK" для синтаксиса шаблонов grok.
Примеры
Следующий пример анализирует строку, содержащую метку времени, IP-адрес, адрес электронной почты и число:
ROW a = "2023-01-23T12:15:00.000Z 127.0.0.1 some.email@foo.com 42"
| GROK a """%{TIMESTAMP_ISO8601:date} %{IP:ip} %{EMAILADDRESS:email} %{NUMBER:num}"""
| KEEP date, ip, email, num | date:keyword | ip:keyword | email:keyword | num:keyword |
|---|---|---|---|
2023-01-23T12:15:00.000Z | 127.0.0.1 | 42 |
По умолчанию GROK выводит столбцы строк типа keyword. int и float типы можно преобразовать, добавив :type к семантике в шаблоне. Например, {NUMBER:num:int}:
ROW a = "2023-01-23T12:15:00.000Z 127.0.0.1 some.email@foo.com 42"
| GROK a """%{TIMESTAMP_ISO8601:date} %{IP:ip} %{EMAILADDRESS:email} %{NUMBER:num:int}"""
| KEEP date, ip, email, num | date:keyword | ip:keyword | email:keyword | num:integer |
|---|---|---|---|
2023-01-23T12:15:00.000Z | 127.0.0.1 | 42 |
Для других преобразований типов используйте функции преобразования типов:
ROW a = "2023-01-23T12:15:00.000Z 127.0.0.1 some.email@foo.com 42"
| GROK a """%{TIMESTAMP_ISO8601:date} %{IP:ip} %{EMAILADDRESS:email} %{NUMBER:num:int}"""
| KEEP date, ip, email, num
| EVAL date = TO_DATETIME(date) | ip:keyword | email:keyword | num:integer | date:date |
|---|---|---|---|
127.0.0.1 | 42 | 2023-01-23T12:15:00.000Z |
Если имя поля используется более одного раза, GROK создаёт столбец с множественными значениями:
FROM addresses
| KEEP city.name, zip_code
| GROK zip_code """%{WORD:zip_parts} %{WORD:zip_parts}""" | city.name:keyword | zip_code:keyword | zip_parts:keyword |
|---|---|---|
Амстердам | 1016 ED | ["1016", "ED"] |
Сан-Франциско | CA 94108 | ["CA", "94108"] |
Токио | 100-7014 | null |
KEEP
Команда обработки KEEP позволяет указать, какие столбцы будут возвращены и в каком порядке.
Синтаксис
KEEP columns
Параметры
-
columns - Список столбцов через запятую, которые нужно сохранить. Поддерживаются подстановочные знаки. Смотрите ниже поведение в случае, если существующий столбец соответствует нескольким заданным подстановочным знакам или именам столбцов.
Описание
Команда обработки KEEP позволяет указать, какие столбцы будут возвращены и в каком порядке.
При совпадении имени поля с несколькими выражениями применяются правила приоритета. Поля добавляются в порядке их появления. Если одно поле соответствует нескольким выражениям, применяются следующие правила приоритета (от наивысшего к наименьшему):
- Полное имя поля (без подстановочных знаков)
- Частичные выражения с подстановочными знаками (например:
fieldNam*) - Только подстановочные знаки (
*)
Если поле соответствует двум выражениям с одинаковым приоритетом, приоритет получает правое выражение.
Обратитесь к примерам для иллюстрации этих правил приоритета.
Примеры
Столбцы возвращаются в указанном порядке:
FROM employees | KEEP emp_no, first_name, last_name, height
| emp_no:integer | first_name:keyword | last_name:keyword | height:double |
|---|---|---|---|
10001 | Георги | Фачелло | 2.03 |
10002 | Бецалель | Симмель | 2.08 |
10003 | Парто | Бэмфорд | 1.83 |
10004 | Хрис | Коблик | 1.78 |
10005 | Киоичи | Малиняк | 2.05 |
Вместо указания каждого столбца по имени, можно использовать подстановочные знаки для возвращения всех столбцов с именем, соответствующим шаблону:
FROM employees | KEEP h*
| height:double | height.float:double | height.half_float:double | height.scaled_float:double | hire_date:date |
|---|
Подстановочный символ звездочка (*) сам по себе означает все столбцы, не соответствующие другим аргументам.
Этот запрос сначала вернёт все столбцы с именем, начинающимся с h, а затем все остальные столбцы:
FROM employees | KEEP h*, *
| height:double | height.float:double | height.half_float:double | height.scaled_float:double | hire_date:date | avg_worked_seconds:long | birth_date:date | emp_no:integer | first_name:keyword | gender:keyword | is_rehired:boolean | job_positions:keyword | languages:integer | languages.byte:integer | languages.long:long | languages.short:integer | last_name:keyword | salary:integer | salary_change:double | salary_change.int:integer | salary_change.keyword:keyword | salary_change.long:long | still_hired:boolean |
|---|
Следующие примеры демонстрируют, как работают правила приоритета, когда имя поля соответствует нескольким выражениям.
Полное имя поля имеет приоритет перед выражениями с подстановкой:
FROM employees | KEEP first_name, last_name, first_name*
| first_name:keyword | last_name:keyword |
|---|
Выражения с подстановкой имеют одинаковый приоритет, но последнее побеждает (несмотря на то, что оно менее конкретное):
FROM employees | KEEP first_name*, last_name, first_na*
| last_name:keyword | first_name:keyword |
|---|
Простое выражение с подстановкой * имеет самый низкий приоритет. Порядок вывода определяется другими аргументами:
FROM employees | KEEP *, first_name
| avg_worked_seconds:long | birth_date:date | emp_no:integer | gender:keyword | height:double | height.float:double | height.half_float:double | height.scaled_float:double | hire_date:date | is_rehired:boolean | job_positions:keyword | languages:integer | languages.byte:integer | languages.long:long | languages.short:integer | last_name:keyword | salary:integer | salary_change:double | salary_change.int:integer | salary_change.keyword:keyword | salary_change.long:long | still_hired:boolean | first_name:keyword |
|---|
LIMIT
Команда обработки LIMIT позволяет ограничить количество возвращаемых строк.
Синтаксис
LIMIT max_number_of_rows
Параметры
-
max_number_of_rows - Максимальное количество строк для возврата.
Описание
Команда обработки LIMIT позволяет ограничить количество возвращаемых строк. Запросы не возвращают более 10 000 строк, независимо от значения команды LIMIT.
Это ограничение применяется только к количеству строк, извлекаемых запросом. Запросы и агрегации выполняются на полном наборе данных.
Чтобы обойти это ограничение:
Значения по умолчанию и максимальные значения могут быть изменены с помощью следующих динамических параметров кластера:
-
esql.query.result_truncation_default_size -
esql.query.result_truncation_max_size
Пример
FROM employees | SORT emp_no ASC | LIMIT 5
MV_EXPAND
Эта функциональность находится на стадии технического предварительного просмотра и может быть изменена или удалена в будущих выпусках. Elastic будет работать над устранением любых проблем, но функции технического предварительного просмотра не подпадают под SLA поддержки официальных функций GA.
Команда обработки MV_EXPAND расширяет многозначные столбцы в одну строку на значение, дублируя другие столбцы.
Синтаксис
MV_EXPAND column
Параметры
-
column - Многозначный столбец для расширения.
Пример
ROW a=[1,2,3], b="b", j=["a","b"] | MV_EXPAND a
| a:integer | b:keyword | j:keyword |
|---|---|---|
1 | b | ["a", "b"] |
2 | b | ["a", "b"] |
3 | b | ["a", "b"] |
RENAME
Команда обработки RENAME переименовывает один или несколько столбцов.
Синтаксис
RENAME old_name1 AS new_name1[, ..., old_nameN AS new_nameN]
Параметры
-
old_nameX - Название столбца, который нужно переименовать.
-
new_nameX - Новое имя столбца. Если оно конфликтует с существующим именем столбца, существующий столбец удаляется. Если несколько столбцов переименовываются в одно и то же имя, все, кроме самого правого столбца с тем же новым именем, удаляются.
Описание
Команда обработки RENAME переименовывает один или несколько столбцов. Если столбец с новым именем уже существует, он будет заменён новым.
Примеры
FROM employees | KEEP first_name, last_name, still_hired | RENAME still_hired AS employed
Несколько столбцов могут быть переименованы с помощью одной команды RENAME:
FROM employees | KEEP first_name, last_name | RENAME first_name AS fn, last_name AS ln
SORT
Команда обработки SORT сортирует таблицу по одному или нескольким столбцам.
Синтаксис
SORT column1 [ASC/DESC][NULLS FIRST/NULLS LAST][, ..., columnN [ASC/DESC][NULLS FIRST/NULLS LAST]]
Параметры
-
columnX - Столбец для сортировки.
Описание
Команда обработки SORT сортирует таблицу по одному или нескольким столбцам.
По умолчанию сортировка выполняется по возрастанию. Используйте ASC или DESC для задания явного порядка сортировки.
Две строки с одинаковым ключом сортировки считаются равными. Вы можете предоставить дополнительные выражения сортировки для разрыва ничьих.
Сортировка по многозначным столбцам использует самое низкое значение при сортировке по возрастанию и самое высокое значение при сортировке по убыванию.
По умолчанию значения null считаются большими, чем любые другие. При сортировке по возрастанию значения null будут отсортированы последними, а при сортировке по убыванию — первыми. Вы можете изменить это, указав NULLS FIRST или NULLS LAST.
Примеры
FROM employees | KEEP first_name, last_name, height | SORT height
Явное упорядочение по возрастанию с помощью ASC:
FROM employees | KEEP first_name, last_name, height | SORT height DESC
Предоставление дополнительных выражений сортировки для обработки совпадений:
FROM employees | KEEP first_name, last_name, height | SORT height DESC, first_name ASC
Сортировка значений null вначале с помощью NULLS FIRST:
FROM employees | KEEP first_name, last_name, height | SORT first_name ASC NULLS FIRST
STATS
Команда обработки STATS группирует строки по общему значению и вычисляет одну или несколько агрегированных значений по сгруппированным строкам.
Синтаксис
STATS [column1 =] expression1 [WHERE boolean_expression1][,
...,
[columnN =] expressionN [WHERE boolean_expressionN]]
[BY grouping_expression1[, ..., grouping_expressionN]] Параметры
-
columnX - Имя, под которым возвращается агрегированное значение. Если опущено, имя равно соответствующему выражению (
expressionX). Если несколько столбцов имеют одинаковое имя, все, кроме правого столбца с этим именем, будут проигнорированы. -
expressionX - Выражение, вычисляющее агрегированное значение.
-
grouping_expressionX - Выражение, которое выводит значения для группировки. Если его имя совпадает с одним из вычисленных столбцов, этот столбец будет проигнорирован.
-
boolean_expressionX - Условие, которое должно выполняться для строки, чтобы она была включена в вычисление
expressionX.
Индивидуальные значения null пропускаются при вычислении агрегаций.
Описание
Команда обработки STATS группирует строки по общему значению и вычисляет одно или несколько агрегированных значений по сгруппированным строкам. Для вычисления каждого агрегированного значения строки в группе могут быть отфильтрованы с помощью WHERE. Если BY опущено, выходная таблица содержит ровно одну строку с агрегациями, применёнными к всему набору данных.
Поддерживаются следующие функции агрегирования:
-
AVG -
COUNT -
COUNT_DISTINCT -
MAX -
MEDIAN -
MEDIAN_ABSOLUTE_DEVIATION -
MIN -
PERCENTILE - [preview] Данная функциональность находится в техническом предварительном просмотре и может быть изменена или удалена в будущих версиях. Elastic будет работать над устранением любых проблем, но функции в техническом предварительном просмотре не подпадают под SLA поддержки официальных функций GA.
ST_CENTROID_AGG -
SUM -
TOP -
VALUES -
WEIGHTED_AVG
Поддерживаются следующие функции группировки:
STATS без каких-либо групп намного быстрее, чем добавление группы.
Группировка по одному выражению в настоящее время оптимизирована намного лучше, чем группировка по многим выражениям. В некоторых тестах мы видели, что группировка по одному столбцу keyword в пять раз быстрее, чем группировка по двум столбцам keyword. Не пытайтесь обойти это, объединив два столбца вместе, например, с помощью CONCAT, а затем группируя — это не будет быстрее.
Примеры
Вычисление статистики и группировка по значениям другого столбца:
FROM employees | STATS count = COUNT(emp_no) BY languages | SORT languages
| count:long | languages:integer |
|---|---|
15 | 1 |
19 | 2 |
17 | 3 |
18 | 4 |
21 | 5 |
10 | null |
Опущение BY возвращает одну строку с агрегациями, применёнными к всему набору данных:
FROM employees | STATS avg_lang = AVG(languages)
| avg_lang:double |
|---|
3.1222222222222222 |
Можно вычислять несколько значений:
FROM employees | STATS avg_lang = AVG(languages), max_lang = MAX(languages)
| avg_lang:double | max_lang:integer |
|---|---|
3.1222222222222222 | 5 |
Для фильтрации строк, используемых в агрегации, используйте клаузу WHERE:
FROM employees
| STATS avg50s = AVG(salary)::LONG WHERE birth_date < "1960-01-01",
avg60s = AVG(salary)::LONG WHERE birth_date >= "1960-01-01"
BY gender
| SORT gender | avg50s:long | avg60s:long | gender:keyword |
|---|---|---|
55462 | 46637 | F |
48279 | 44879 | M |
Агрегации могут быть смешанными, с фильтром и группировкой, которые также являются необязательными:
FROM employees
| EVAL Ks = salary / 1000 // thousands
| STATS under_40K = COUNT(*) WHERE Ks < 40,
inbetween = COUNT(*) WHERE 40 <= Ks AND Ks < 60,
over_60K = COUNT(*) WHERE 60 <= Ks,
total = COUNT(*) | under_40K:long | inbetween:long | over_60K:long | total:long |
|---|---|---|---|
36 | 39 | 25 | 100 |
Если ключ группировки многозначный, входная строка находится во всех группах:
ROW i=1, a=["a", "b"] | STATS MIN(i) BY a | SORT a ASC
| MIN(i):integer | a:keyword |
|---|---|
1 | a |
1 | b |
Также можно сгруппировать по нескольким значениям:
FROM employees
| EVAL hired = DATE_FORMAT("yyyy", hire_date)
| STATS avg_salary = AVG(salary) BY hired, languages.long
| EVAL avg_salary = ROUND(avg_salary)
| SORT hired, languages.long Если все ключи группировки многозначные, входная строка находится во всех группах:
ROW i=1, a=["a", "b"], b=[2, 3] | STATS MIN(i) BY a, b | SORT a ASC, b ASC
| MIN(i):integer | a:keyword | b:integer |
|---|---|---|
1 | a | 2 |
1 | a | 3 |
1 | b | 2 |
1 | b | 3 |
И агрегирующие функции, и выражения группировки принимают другие функции. Это полезно для использования STATS на столбцах с несколькими значениями. Например, чтобы вычислить среднее изменение заработной платы, вы можете использовать MV_AVG, чтобы сначала усреднить несколько значений на сотрудника, и использовать результат с функцией AVG:
FROM employees | STATS avg_salary_change = ROUND(AVG(MV_AVG(salary_change)), 10)
| avg_salary_change:double |
|---|
1.3904535865 |
Пример группировки по выражению — группировка сотрудников по первой букве их фамилии:
FROM employees | STATS my_count = COUNT() BY LEFT(last_name, 1) | SORT `LEFT(last_name, 1)`
| my_count:long | LEFT(last_name, 1):keyword |
|---|---|
2 | A |
11 | B |
5 | C |
5 | D |
2 | E |
4 | F |
4 | G |
6 | H |
2 | J |
3 | K |
5 | L |
12 | M |
4 | N |
1 | O |
7 | P |
5 | R |
13 | S |
4 | T |
2 | W |
3 | Z |
Указание имени выходного столбца необязательно. Если оно не указано, новое имя столбца равно выражению. Следующий запрос возвращает столбец, названный AVG(salary):
FROM employees | STATS AVG(salary)
| AVG(salary):double |
|---|
48248.55 |
Поскольку это имя содержит специальные символы, его необходимо заключить в кавычки с обратными апострофами (`) при использовании его в последующих командах:
FROM employees | STATS AVG(salary) | EVAL avg_salary_rounded = ROUND(`AVG(salary)`)
| AVG(salary):double | avg_salary_rounded:double |
|---|---|
48248.55 | 48249.0 |
WHERE
Команда обработки WHERE создаёт таблицу, которая содержит все строки из входной таблицы, для которых заданное условие вычисляется как true.
Синтаксис
WHERE expression
Параметры
-
expression - Булево выражение.
Примеры
FROM employees | KEEP first_name, last_name, still_hired | WHERE still_hired == true
Что, если still_hired — булевое поле, может быть упрощено до:
FROM employees | KEEP first_name, last_name, still_hired | WHERE still_hired
Используйте математические операции с датами, чтобы получить данные из определённого временного интервала. Например, чтобы получить последние час логов:
FROM sample_data | WHERE @timestamp > NOW() - 1 hour
WHERE поддерживает различные функции. Например, функция LENGTH:
FROM employees | KEEP first_name, last_name, height | WHERE LENGTH(first_name) < 4
Полный список всех функций см. в Обзоре функций.
Для сравнения NULL используйте предикаты IS NULL и IS NOT NULL:
FROM employees | WHERE birth_date IS NULL | KEEP first_name, last_name | SORT first_name | LIMIT 3
| first_name:keyword | last_name:keyword |
|---|---|
Basil | Tramer |
Florian | Syrotiuk |
Lucien | Rosenbaum |
FROM employees | WHERE is_rehired IS NOT NULL | STATS COUNT(emp_no)
| COUNT(emp_no):long |
|---|
84 |
Используйте LIKE для фильтрации данных по шаблонам строк с подстановочными знаками. LIKE обычно действует на поле, расположенном слева от оператора, но также может действовать на константное (литеральное) выражение. Правая часть оператора представляет шаблон.
Поддерживаются следующие символы подстановки:
-
*соответствует нулю или более символам. -
?соответствует одному символу.
Поддерживаемые типы
| str | pattern | result |
|---|---|---|
keyword | keyword | boolean |
text | text | boolean |
FROM employees | WHERE first_name LIKE """?b*""" | KEEP first_name, last_name
| first_name:keyword | last_name:keyword |
|---|---|
Ebbe | Callaway |
Eberhardt | Terkki |
Совпадение точных символов * и . потребует экранирования. Символ экранирования — обратный слэш \. Так как обратный слэш также является специальным символом в строковых литералах, потребуется дополнительное экранирование.
ROW message = "foo * bar" | WHERE message LIKE "foo \\* bar"
Для уменьшения нагрузки на экранирование, мы рекомендуем использовать строковые литералы в тройных кавычках """
ROW message = "foo * bar" | WHERE message LIKE """foo \* bar"""
Используйте RLIKE для фильтрации данных по шаблонам строк с использованием регулярных выражений. RLIKE обычно действует на поле, расположенном слева от оператора, но также может действовать на константное (литеральное) выражение. Правая часть оператора представляет шаблон.
Поддерживаемые типы
| str | pattern | result |
|---|---|---|
ключевое слово | ключевое слово | булево |
текст | текст | булево |
FROM employees | WHERE first_name RLIKE """.leja.*""" | KEEP first_name, last_name
| first_name:ключевое слово | last_name:ключевое слово |
|---|---|
Алехандро | МакАлпин |
Сопоставление специальных символов (например, ., *, (…) потребует экранирования. Символом экранирования является обратный слэш \. Поскольку обратный слэш также является специальным символом в строковых литералах, он также потребует дополнительного экранирования.
ROW message = "foo ( bar" | WHERE message RLIKE "foo \\( bar"
Для уменьшения накладных расходов на экранирование мы рекомендуем использовать строки с тройными кавычками """
ROW message = "foo ( bar" | WHERE message RLIKE """foo \( bar"""
Оператор IN позволяет проверить, равен ли поле или выражение элементу в списке литералов, полей или выражений:
ROW a = 1, b = 4, c = 3 | WHERE c-a IN (3, b / 2, a)
| a:целое число | b:целое число | c:целое число |
|---|---|---|
1 | 4 | 3 |
Полный список всех операторов см. в разделе Операторы.
© 2023-2025 Elasticsearch
As of September 2024, Elasticsearch is available under a choice of three licenses: the Server Side Public License (SSPL), the Elastic License, or the AGPLv3 (OSI approved).
Elasticsearch and the Elasticsearch logo are trademarks of Elasticsearch B.V., registered in the U.S. and in other countries.
https://www.elastic.co/guide/en/elasticsearch/reference/8.17/esql-commands.html