正在加载

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 字段时,该值必须完全匹配,包括标点符号和大小写。但是,查询文本字段时,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.referrerhttps://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" }

由于嵌套字段可能位于其他嵌套字段内,因此您必须指定要查询的嵌套字段的完整路径。例如,考虑以下文档,其中 usernames 都是嵌套字段

{
  "user": [
    {
      "names": [
        {
          "first": "John",
          "last": "Smith"
        },
        {
          "first": "Alice",
          "last": "White"
        }
      ]
    }
  ]
}

要查找 user.names 数组中的单个值包含名为“Alice”姓为“White”的文档,请使用以下命令

user.names:{ first: "Alice" and last: "White" }
© . All rights reserved.