Kibana 查询语言 (KQL) 是一种使用自由文本搜索或基于字段的搜索过滤 Elasticsearch 数据的简单语法。 KQL 仅用于过滤数据,并没有对数据进行排序或聚合的作用。
KQL 能够在您键入时建议字段名称、值和运算符。 建议的性能由 Kibana 设置控制。
KQL 具有与 Lucene 查询语法不同的一组特性。 KQL 能够查询嵌套字段和脚本字段。 KQL 不支持正则表达式或使用模糊术语进行搜索。 要使用旧版 Lucene 语法,请单击搜索字段旁边的 KQL,然后关闭 KQL。
一、术语查询
- 要使用精确的搜索词进行查询,请输入字段名称,后跟:,然后输入以空格分隔的值:
http.response.status_code:400 401 404
- 对于文本字段,这将匹配任何值,而不管顺序如何:
http.response.body.content.text:quick brown fox
3.要查询确切的短语,请在值周围使用引号:
http.response.body.content.text:"quick brown fox"
- KQL 不需要字段名称。 如果未提供字段名称,则术语将与索引设置中的默认字段匹配。 要跨字段搜索:
"quick brown fox"
二、布尔查询
KQL 支持 or、and 和 not。 默认情况下,and 的优先级高于 or。 要覆盖默认优先级,请将括号中的运算符分组。 这些运算符可以是大写或小写。
- 要匹配响应为 200、扩展名是 php 或两者兼有的文档:
response:200 or extension:php
- 要匹配响应为 200 且扩展名为 php 的文档:
response:200 and extension:php
- 匹配响应为 200 或 404 的文档。
response:(200 or 404)
- 要匹配响应为 200 且扩展名是 php 或 css 的文档:
response:200 and (extension:php or extension:css)
- 要匹配响应为 200 且扩展名为 php 或扩展为 css 且响应为任何内容的文档:
response:200 and extension:php or extension:css
- 要匹配响应不是 200 的文档:
not response:200
- 匹配响应为 200 但扩展名不是 php 或 css 的文档。
response:200 and not (extension:php or extension:css)
8, 要匹配包含术语列表的多值字段:
tags:(success and info and security)
三、范围查询
KQL 支持数字和日期类型的 >、>=、< 和 <=。
account_number >= 100 and items_sold <= 200
四、日期范围查询
通常,Kibana 的时间过滤器足以设置时间范围,但在某些情况下,您可能需要搜索日期。 在引号中包含日期范围。
@timestamp < "2021-01-02T21:55:59"
@timestamp < "2021-01"
@timestamp < "2021"
KQL 支持日期数学表达式。
@timestamp < now-1d
updated_at > 2022-02-17||+1M/d
五、是否存在查询
存在查询匹配包含任何字段值的文档,在本例中为响应:
response:*
Existence 由 Elasticsearch 定义,包括所有值,包括空文本。
六、通配符查询
通配符查询可用于按字词前缀搜索或搜索多个字段。 出于性能原因,Kibana 的默认设置会阻止前导通配符,但这可以通过高级设置来允许。
- 要匹配 machine.os 以 win 开头的文档,例如“windows 7”和“windows 10”:
machine.os:win*
- 要匹配多个字段:
machine.os*:windows 10
当您拥有字段的文本和关键字版本时,此语法很方便。 该查询会检查 machine.os 和 machine.os.keyword 中是否存在术语 windows 10。
# 七、嵌套字段查询
查询嵌套字段的一个主要考虑因素是如何将嵌套查询的部分内容与单个嵌套文档进行匹配。 你可以:
仅将部分查询匹配到单个嵌套文档。 这是大多数用户在查询嵌套字段时想要的。 将部分查询匹配到不同的嵌套文档。 这就是常规对象字段的工作方式。 此查询通常不如匹配单个文档有用。 在以下文档中,items 是一个嵌套字段。 嵌套字段中的每个文档都包含名称、库存和类别。
{
"grocery_name": "Elastic Eats",
"items": [
{
"name": "banana",
"stock": "12",
"category": "fruit"
},
{
"name": "peach",
"stock": "10",
"category": "fruit"
},
{
"name": "carrot",
"stock": "9",
"category": "vegetable"
},
{
"name": "broccoli",
"stock": "5",
"category": "vegetable"
}
]
}
- 匹配单个文档
要匹配库存超过 10 个香蕉的商店:
items:{ name:banana and stock > 10 }
items 是嵌套路径。 花括号(嵌套组)内的所有内容都必须匹配单个嵌套文档。
以下查询不返回任何匹配项,因为没有单个嵌套文档具有库存为 9 的香蕉。
items:{ name:banana and stock:9 }
- 匹配不同的文档
以下子查询位于单独的嵌套组中,可以匹配不同的嵌套文档:
items:{ name:banana } and items:{ stock:9 }
name:banana 匹配数组中的第一个文档,stock:9 匹配数组中的第三个文档。
- 匹配单个和不同的文档
要查找库存超过 10 个香蕉且还备有蔬菜的商店:
items:{ name:banana and stock > 10 } and items:{ category:vegetable }
第一个嵌套组(name:banana 和 stock > 10)必须匹配单个文档,但 category:vegetables 子查询可以匹配不同的嵌套文档,因为它位于单独的组中。
- 其他嵌套字段中的嵌套字段
KQL 支持其他嵌套字段中的嵌套字段——您必须指定完整路径。 在本文档中,level1 和 level2 是嵌套字段:
{
"level1": [
{
"level2": [
{
"prop1": "foo",
"prop2": "bar"
},
{
"prop1": "baz",
"prop2": "qux"
}
]
}
]
}
要匹配单个嵌套文档:
level1.level2:{ prop1:foo and prop2:bar }