KQL
Elastic Stack Serverless
Kibana 查询语言 (KQL) 是一种简单的基于文本的查询语言,用于过滤数据。
- KQL 仅过滤数据,不参与聚合、转换或排序数据。
- KQL 不要与 Lucene 查询语言 混淆,后者具有不同的功能集。
使用 KQL 过滤字段值存在、匹配给定值或在给定范围内的文档。
使用 KQL 将自由文本搜索与基于字段的搜索结合起来。键入一个搜索词以匹配所有字段,或开始键入字段名以获取字段名和运算符的建议,您可以使用这些来构建结构化查询。半结构化搜索将过滤匹配的文档,并仅返回匹配的文档。
| 精确短语查询 | http.response.body.content.text:"quick brown fox" |
| 术语查询 | http.response.status_code:400 401 404 |
| 布尔查询 | response:200 or extension:php |
| 范围查询 | account_number >= 100 and items_sold <= 200 |
| 通配符查询 | machine.os:win* |
要过滤其中给定字段存在索引值的文档,请使用 * 运算符。例如,要过滤 http.request.method 字段存在的文档,请使用以下语法
http.request.method: *
这会检查任何索引值,包括空字符串。
使用 KQL 过滤匹配特定数字、文本、日期或布尔值的文档。例如,要过滤 http.request.method 为 GET 的文档,请使用以下查询
http.request.method: GET
字段参数是可选的。如果未提供,则搜索所有字段以查找给定值。例如,要在所有字段中搜索“Hello”,请使用以下
Hello
在查询 keyword、numeric、date 或 boolean 字段时,值必须精确匹配,包括标点符号和大小写。但是,在查询 text 字段时,Elasticsearch 会根据 字段的映射设置 分析提供的值。例如,要搜索 http.request.body.content(一个 text 字段)包含文本“null pointer”的文档
http.request.body.content: null pointer
因为这是一个 text 字段,所以这些搜索词的顺序无关紧要,即使包含“pointer null”的文档也会返回。要搜索 text 字段中术语顺序与提供的顺序相同的文档,请将值用引号括起来,如下所示
http.request.body.content: "null pointer"
某些字符必须用反斜杠转义(除非被引号括起来)。例如,要搜索 http.request.referrer 为 https://example.com 的文档,请使用以下任一查询
http.request.referrer: "https://example.com"
http.request.referrer: https\://example.com
您必须转义以下字符
\():<>"*
要搜索包含在提供范围内的文档,请使用 KQL 的范围语法。例如,要搜索 http.response.bytes 小于 10000 的所有文档,请使用以下语法
http.response.bytes < 10000
要搜索包含范围,请组合多个范围查询。例如,要搜索 http.response.bytes 大于 10000 且小于或等于 20000 的文档,请使用以下语法
http.response.bytes > 10000 and http.response.bytes <= 20000
您还可以对字符串值、IP 地址和时间戳使用范围语法。例如,要搜索早于两周前的文档,请使用以下语法
@timestamp < now-2w
有关可接受日期格式的更多示例,请参阅 日期数学。
要搜索匹配模式的文档,请使用通配符语法。例如,要查找 http.response.status_code 以 4 开头的文档,请使用以下语法
http.response.status_code: 4*
出于性能原因,默认情况下不允许前导通配符。您可以使用 query:allowLeadingWildcards 高级设置来修改此设置。
目前仅支持 *。这匹配零个或多个字符。
要否定或排除一组文档,请使用 not 关键字(不区分大小写)。例如,要过滤 http.request.method **不是** GET 的文档,请使用以下查询
NOT http.request.method: GET
要组合多个查询,请使用 and/or 关键字(不区分大小写)。例如,要查找 http.request.method 是 GET **或** http.response.status_code 是 400 的文档,请使用以下查询
http.request.method: GET OR http.response.status_code: 400
同样,要查找 http.request.method 是 GET **且** http.response.status_code 是 400 的文档,请使用此查询
http.request.method: GET AND http.response.status_code: 400
要在组合多个查询时指定优先级,请使用括号。例如,要查找 http.request.method 是 GET **且** http.response.status_code 是 200 的文档,**或** http.request.method 是 POST **且** http.response.status_code 是 400 的文档,请使用以下
(http.request.method: GET AND http.response.status_code: 200) OR
(http.request.method: POST AND http.response.status_code: 400)
您还可以对同一字段的多个值使用括号进行简写语法。例如,要查找 http.request.method 是 GET、POST **或** DELETE 的文档,请使用以下
http.request.method: (GET OR POST OR DELETE)
通配符也可用于查询多个字段。例如,要搜索 datastream 的任何子字段包含“logs”的文档,请使用以下
datastream.*: logs
当使用通配符查询多个字段时,如果字段类型不同,可能会出现错误。例如,如果 datastream.* 同时匹配数字和字符串字段,则上述查询将导致错误,因为无法对数字字段进行字符串值查询。
查询 嵌套字段 需要特殊语法。请考虑以下文档,其中 user 是一个嵌套字段
{
"user" : [
{
"first" : "John",
"last" : "Smith"
},
{
"first" : "Alice",
"last" : "White"
}
]
}
要查找 user 数组中包含名字“Alice”和姓氏“White”的文档,请使用以下
user:{ first: "Alice" and last: "White" }
因为嵌套字段可以包含在其他嵌套字段中,所以您必须指定要查询的嵌套字段的完整路径。例如,请考虑以下文档,其中 user 和 names 都是嵌套字段
{
"user": [
{
"names": [
{
"first": "John",
"last": "Smith"
},
{
"first": "Alice",
"last": "White"
}
]
}
]
}
要查找 user.names 数组中包含名字“Alice”**且**姓氏“White”的文档,请使用以下
user.names:{ first: "Alice" and last: "White" }