Kibana中的KQL语法使用
原文地址:https://juejin.cn/post/7045085869979467789
官方地址:https://www.elastic.co/guide/en/kibana/current/kuery-query.html#_nested_field_queries
一、简介
KQL:(Kibana Query Language )查询语法是Kibana为了简化ES查询设计的一套简单查询语法,Kibana支持索引字段和语法补全,可以非常方便的查询数据。

如果关闭 KQL,Kibana 将使用 Lucene。
在Kibana中使用Filters对数据进行过滤使用KQL语法来完成。
二、查询语法
2.1 等值匹配(equals)
字段名:匹配值
示例一
response:200 # 匹配到的结果 200 hello world 200 hello 200 world
查询出response字段中包含200的文档对象,注意是包含,包含的是200这一个词。
需要注意的是1200或者2001,是不能被查出来的。
示例二
message:"hello world yes"
上面这个表达式,是针对message字段进行搜索,在搜索的时候不会区分大小写。
需要注意,上面的"hello world yes"使用了引号,这样的话,这3个单词会被作为一个词进行查询,不会再进行分词。
示例三
message:hello world
#匹配到的结果
hello
world
Hello
World
hello world
Hello world
hello yes World
yes world
world yes
上面这个表达式,针对message字段进行搜索,搜索message中包含hello,或者包含world,或者两者都包含的情况;
不区分大小写,也不会保证顺序
2.2 关系运算符
关系运算符只能用在数值和时间类型的字段
|
符号
|
说明
|
|---|---|
|
<=
|
小于等于
|
|
>=
|
大于等于
|
|
<
|
小于
|
|
>
|
大于
|
示例一
account_number >=100
上面这个表达式,针对account_number字段进行搜索,搜索account_number的值大于等于100的数据。
示例二
# 搜索日期 # 搜索具体时间 @timestamp < "2021-01-02T21:55:59" # 搜索年-月份 @timestamp < "2021-01" #搜索年 @timestamp < "2021"
2.3 逻辑运算符
支持逻辑运算符如下:
- and:与
- or:或
- not:非
示例一
# and 的用法
name:jane and addr:beijing
上面这个条件,会查询name字段包含jane,且addr字段包含beijing的记录。
注意:查询结果不区分大小写
示例二
# or 的用法
name:jane or addr:beijing
上面这个查询条件,会查询name字段包含jane,或者addr字段包含beijing的记录,或者两者都匹配;
示例三
# not 的用法 #查询出response字段中不包含200的记录 not response:200 # 查询response包含200,并且整条记录不包含yes的数据记录 response:200 and not yes # 查询response包含200,且response不包含yes的记录 response:(200 and not yes)
示例四
name:jane and addr:beijing or job:teacher
上面的查询条件,查询name包含jane,且addr包含beijing的记录,或者job包含teacher的记录。
注意:KQL中,and的优先级高于or
对于上方结果可以使用小括号来更好的理解
(name:jane and addr:beijing) or job:teacher
示例五
response:(200 or 404)
# 与上方表达式等价
response:200 or response:400
上面这个表达式,会查询response包含200,或者response包含404,或者包含200和404的记录(不保证顺序、不区分大小写);
同时可以使用and来表示“且”的关系。
2.4 通配符查询
匹配包含指定字段的文档。
语法
字段名:* 字段名*:属性值 字段名:属性值*
"*"代表通配符,可以添加到字段名中,也可以添加到属性值当中,代表匹配任意字符。
示例一
response:*
上面这个查询条件,会返回所有包含response字段的文档对象。
示例二
machine*:hello
查询字段名以machine开头,字段值为hello的数据。
示例三
# 查询字段名为machine,字段值以hello开头的数据 machine:hello* # 查询字段名为FlightNum,字段值开头为T,结尾为V的数据 FlightNum:T*V

2.5 字段嵌套查询
首先准备一个多层的数据,比如下面的这几条数据。
{ "level1": [ { "level2": [ { "prop1": "foo", "prop2": "bar" }, { "prop1": "baz", "prop2": "qux" } ] } ] }
foo 或者是 baz的,可以这样写:level1.level2 { prop1: "foo" or prop1: "baz" }

浙公网安备 33010602011771号