ES|QL 命令编辑

源命令编辑

ES|QL 源命令生成一个表,通常包含来自 Elasticsearch 的数据。ES|QL 查询必须以源命令开头。

A source command producing a table from Elasticsearch

ES|QL 支持以下源命令

处理命令编辑

ES|QL 处理命令通过添加、删除或更改行和列来更改输入表。

A processing command changing an input table

ES|QL 支持以下处理命令

FROM编辑

语法

FROM index_pattern [METADATA fields]

参数

index_pattern
索引、数据流或别名的列表。支持通配符和日期数学。
fields
要检索的 元数据字段 的逗号分隔列表。

描述

FROM 源命令返回一个包含来自数据流、索引或别名的数据的表。结果表中的每一行代表一个文档。每一列对应一个字段,可以通过该字段的名称访问。

默认情况下,没有显式 LIMIT 的 ES|QL 查询使用隐式限制 1000。这同样适用于 FROM。没有 LIMITFROM 命令

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-*

请参阅 跨集群使用 ES|QL

使用可选的 METADATA 指令来启用 元数据字段

FROM employees METADATA _id

ROW编辑

语法

ROW column1 = value1[, ..., columnN = valueN]

参数

columnX
列名。
valueX
列的值。可以是字面量、表达式或 函数

描述

ROW 源命令生成一行,其中包含一个或多个具有您指定值的列。这对于测试很有用。

示例

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 item

参数

item
只能是 INFO

描述

SHOW 源命令返回有关部署及其功能的信息

  • 使用 SHOW INFO 返回部署的版本、构建日期和哈希值。

示例

SHOW INFO
version date hash

8.13.0

2024-02-23T10:04:18.123117961Z

04ba8c8db2507501c88f215e475de7b0798cb3b3

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

192.168.1.1

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 默认情况下,DISSECT 输出关键字字符串列。要转换为其他类型,请使用 类型转换函数

some text

127.0.0.1

2023-01-23T12:15:00.000Z

date:date

语法

DROP columns

参数

DROP编辑
columns

描述

要删除的列的逗号分隔列表。支持通配符。

示例

FROM employees
| DROP height

DROP 处理命令删除一个或多个列。

FROM employees
| DROP height*

您可以使用通配符来删除所有名称与模式匹配的列,而不是按名称指定每个列

语法

ENRICH policy [ON match_field] [WITH [new_name1 = ]field1, [new_name2 = ]field2, ...]

参数

ENRICH编辑
policy
丰富策略的名称。您需要先 创建执行 丰富策略。
mode
跨集群 ES|QL 中丰富命令的模式。请参阅 跨集群丰富
match_field
匹配字段。ENRICH 使用其值在丰富索引中查找记录。如果未指定,则匹配将在与 丰富策略 中定义的 match_field 同名的列上执行。
fieldX
来自丰富索引的丰富字段,这些字段将作为新列添加到结果中。如果与丰富字段同名的列已存在,则现有列将被新列替换。如果未指定,则添加策略中定义的每个丰富字段
new_nameX

描述

使您能够更改为每个丰富字段添加的列的名称。默认为丰富字段名称。

esql enrich

ENRICH 使您能够使用丰富策略将来自现有索引的数据作为新列添加。有关设置策略的信息,请参阅 数据丰富

示例

在使用 ENRICH 之前,您需要 创建并执行丰富策略

ROW language_code = "1"
| ENRICH languages_policy
以下示例使用 languages_policy 丰富策略为策略中定义的每个丰富字段添加一个新列。匹配是使用 丰富策略 中定义的 match_field 执行的,并且要求输入表具有与之同名的列(本例中为 language_code)。ENRICH 将根据匹配字段值在 丰富索引 中查找记录。 language_code:keyword

1

language_name:keyword

en

ROW a = "1"
| ENRICH languages_policy ON a
English language_code:keyword

1

language_name:keyword

要使用与策略中定义的 match_field 不同的名称的列作为匹配字段,请使用 ON <column-name>

ROW a = "1"
| ENRICH languages_policy ON a WITH language_name
English language_code:keyword

1

language_name:keyword

a:keyword

ROW a = "1"
| ENRICH languages_policy ON a WITH name = language_name
English b:keyword

1

language_name:keyword

en

English

语法

EVAL [column1 =] value1[, ..., [columnN =] valueN]

参数

columnX
列名。
valueX
列的值。可以是字面量、表达式或 函数

描述

默认情况下,策略中定义的每个丰富字段都将作为列添加。要显式选择添加的丰富字段,请使用 WITH <field1>, <field2>, ...

示例

FROM employees
| SORT emp_no
| KEEP first_name, last_name, height
| EVAL height_feet = height * 3.281, height_cm = height * 100
您可以使用 WITH new_name=<field1> 重命名添加的列 name:keyword English 在发生名称冲突的情况下,新创建的列将覆盖现有列。 EVAL编辑

EVAL 处理命令使您能够使用计算值追加新列。EVAL 支持各种用于计算值的函数。有关更多信息,请参阅 函数

first_name:keyword

2.03

6.66043

202.99999999999997

last_name:keyword

height:double

2.08

6.82448

208.0

height_feet:double

height_cm:double

1.83

6.004230000000001

183.0

Georgi

FROM employees
| SORT emp_no
| KEEP first_name, last_name, height
| EVAL height = height * 3.281
您可以使用 WITH new_name=<field1> 重命名添加的列 name:keyword English

EVAL 处理命令使您能够使用计算值追加新列。EVAL 支持各种用于计算值的函数。有关更多信息,请参阅 函数

first_name:keyword

6.66043

last_name:keyword

height:double

6.82448

height_feet:double

height_cm:double

6.004230000000001

Facello

FROM employees
| SORT emp_no
| KEEP first_name, last_name, height
| EVAL height * 3.281
您可以使用 WITH new_name=<field1> 重命名添加的列 name:keyword English height * 3.281:double

EVAL 处理命令使您能够使用计算值追加新列。EVAL 支持各种用于计算值的函数。有关更多信息,请参阅 函数

first_name:keyword

2.03

6.66043

last_name:keyword

height:double

2.08

6.82448

height_feet:double

height_cm:double

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 input "pattern"

参数

input
包含要结构化的字符串的列。如果列包含多个值,GROK 将处理每个值。
pattern
一个 grok 模式。

描述

GROK 使您能够从字符串中提取结构化数据GROK 根据正则表达式将字符串与模式匹配,并将指定的模式提取为列。

有关 grok 模式的语法,请参阅使用 GROK 处理数据

示例

以下示例解析包含时间戳、IP 地址、电子邮件地址和数字的字符串

ROW a = "2023-01-23T12:15:00.000Z 127.0.0.1 [email protected] 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

[email protected]

42

默认情况下,GROK 输出关键字字符串列。可以通过在模式中的语义后面追加 :type 来转换 intfloat 类型。例如 {NUMBER:num:int}

ROW a = "2023-01-23T12:15:00.000Z 127.0.0.1 [email protected] 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

[email protected]

42

对于其他类型转换,请使用类型转换函数

ROW a = "2023-01-23T12:15:00.000Z 127.0.0.1 [email protected] 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 默认情况下,DISSECT 输出关键字字符串列。要转换为其他类型,请使用 类型转换函数

127.0.0.1

[email protected]

42

2023-01-23T12:15:00.000Z

KEEP编辑

语法

KEEP columns

参数

DROP编辑
要保留的列的逗号分隔列表。支持通配符。

描述

KEEP 处理命令使您能够指定返回哪些列以及返回它们的顺序。

当字段名称与多个表达式匹配时,将应用优先级规则。字段将按其出现的顺序添加。如果一个字段与多个表达式匹配,则将应用以下优先级规则(从最高到最低优先级)

  1. 完整字段名称(无通配符)
  2. 部分通配符表达式(例如:fieldNam*
  3. 仅通配符(*

如果一个字段与具有相同优先级的两个表达式匹配,则最右边的表达式获胜。

请参阅示例以了解这些优先级规则的说明。

示例

列将按指定的顺序返回

FROM employees
| KEEP emp_no, first_name, last_name, height
emp_no:integer 您可以使用 WITH new_name=<field1> 重命名添加的列 name:keyword English

10001

EVAL 处理命令使您能够使用计算值追加新列。EVAL 支持各种用于计算值的函数。有关更多信息,请参阅 函数

first_name:keyword

2.03

10002

last_name:keyword

height:double

2.08

10003

height_feet:double

height_cm:double

1.83

10004

Chirstian

Koblick

1.78

10005

Kyoichi

Maliniak

2.05

您可以使用通配符返回所有与模式匹配的名称的列,而不是按名称指定每个列

FROM employees
| KEEP h*
English height.float:double height.half_float:double height.scaled_float:double hire_date:date

星号通配符(*)本身转换为所有与其他参数不匹配的列。

此查询将首先返回所有名称以 h 开头的列,然后返回所有其他列

FROM employees
| KEEP h*, *
English height.float:double height.half_float:double height.scaled_float:double hire_date:date avg_worked_seconds:long birth_date:date emp_no:integer 您可以使用 WITH new_name=<field1> 重命名添加的列 gender:keyword is_rehired:boolean job_positions:keyword languages:integer languages.byte:integer languages.long:long languages.short:integer 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*
您可以使用 WITH new_name=<field1> 重命名添加的列 name:keyword

通配符表达式具有相同的优先级,但最后一个表达式获胜(尽管不太具体)

FROM employees
| KEEP first_name*, last_name, first_na*
name:keyword 您可以使用 WITH new_name=<field1> 重命名添加的列

简单的通配符表达式 * 具有最低优先级。输出顺序由其他参数确定

FROM employees
| KEEP *, first_name
avg_worked_seconds:long birth_date:date emp_no:integer gender:keyword English 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 name:keyword salary:integer salary_change:double salary_change.int:integer salary_change.keyword:keyword salary_change.long:long still_hired:boolean 您可以使用 WITH new_name=<field1> 重命名添加的列

LIMIT编辑

语法

LIMIT max_number_of_rows

参数

max_number_of_rows
要返回的最大行数。

描述

LIMIT 处理命令使您能够限制返回的行数。无论 LIMIT 命令的值如何,查询都不会返回超过 10,000 行。

此限制仅适用于查询检索的行数。查询和聚合在完整的数据集上运行。

要克服此限制

  • 通过修改查询以仅返回相关数据来减小结果集大小。使用WHERE 选择更小的数据子集。
  • 将任何查询后处理转移到查询本身。您可以使用 ES|QL STATS ... BY 命令在查询中聚合数据。

可以使用以下动态集群设置更改默认限制和最大限制

  • esql.query.result_truncation_default_size
  • esql.query.result_truncation_max_size

示例

FROM employees
| SORT emp_no ASC
| LIMIT 5

MV_EXPAND编辑

此功能处于技术预览阶段,可能会在将来的版本中更改或删除。Elastic 将努力解决任何问题,但技术预览中的功能不受官方 GA 功能支持 SLA 的约束。

语法

MV_EXPAND column

参数

column
要扩展的多值列。

描述

MV_EXPAND 处理命令将多值列扩展为每值一行,并复制其他列。

示例

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 old_name1 AS new_name1[, ..., old_nameN AS new_nameN]

参数

old_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 column1 [ASC/DESC][NULLS FIRST/NULLS LAST][, ..., columnN [ASC/DESC][NULLS FIRST/NULLS LAST]]

参数

columnX
要排序的列。

描述

SORT 处理命令根据一个或多个列对表进行排序。

默认排序顺序为升序。使用 ASCDESC 指定显式排序顺序。

具有相同排序键的两行被视为相等。您可以提供其他排序表达式作为平局决胜符。

对多值列进行排序时,在升序排序时使用最低值,在降序排序时使用最高值。

默认情况下,null 值被视为大于任何其他值。在升序排序中,null 值最后排序,在降序排序中,null 值最先排序。您可以通过提供 NULLS FIRSTNULLS 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

使用 NULLS FIRSTnull 值排序到最前面

FROM employees
| KEEP first_name, last_name, height
| SORT first_name ASC NULLS FIRST

STATS ... BY编辑

语法

STATS [column1 =] expression1[, ..., [columnN =] expressionN]
[BY grouping_expression1[, ..., grouping_expressionN]]

参数

columnX
返回聚合值的名称。如果省略,则名称等于相应的表达式(expressionX)。
expressionX
计算聚合值的表达式。
grouping_expressionX
输出要分组的值的表达式。

计算聚合时,将跳过单个 null 值。

描述

STATS ... BY 处理命令根据公共值对行进行分组,并计算分组行上的一个或多个聚合值。如果省略 BY,则输出表将包含恰好一行,其中应用于整个数据集的聚合。

支持以下聚合函数

与添加组相比,不带任何组的 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

也可以根据多个值进行分组(仅支持长字段和关键字族字段)

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

聚合函数和分组表达式都接受其他函数。这对于在多值列上使用 STATS...BY 很有用。例如,要计算平均工资变化,可以使用 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

WHEREedit

语法

WHERE expression

参数

表达式
布尔表达式。

描述

WHERE 处理命令生成一个表,该表包含输入表中所有满足提供条件的行的评估结果为 true

示例

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 NULLIS NOT NULL 谓词

FROM employees
| WHERE birth_date IS NULL
| KEEP first_name, last_name
| SORT first_name
| LIMIT 3
您可以使用 WITH new_name=<field1> 重命名添加的列 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 通常作用于放置在运算符左侧的字段,但它也可以作用于常量(文字)表达式。运算符的右侧表示模式。

支持以下通配符

  • * 匹配零个或多个字符。
  • ? 匹配一个字符。
FROM employees
| WHERE first_name LIKE "?b*"
| KEEP first_name, last_name
您可以使用 WITH new_name=<field1> 重命名添加的列 name:keyword

Ebbe

Callaway

Eberhardt

Terkki

使用 RLIKE 根据使用 正则表达式 的字符串模式过滤数据。 RLIKE 通常作用于放置在运算符左侧的字段,但它也可以作用于常量(文字)表达式。运算符的右侧表示模式。

FROM employees
| WHERE first_name RLIKE ".leja.*"
| KEEP first_name, last_name
您可以使用 WITH new_name=<field1> 重命名添加的列 name:keyword

Alejandro

McAlpine

IN 运算符允许测试字段或表达式是否等于文字、字段或表达式的列表中的元素

ROW a = 1, b = 4, c = 3
| WHERE c-a IN (3, b / 2, a)
a:integer b:integer c:integer

1

4

3

有关所有运算符的完整列表,请参阅 运算符