Kibana 查询语法

  • 要搜索一个确切的字符串,即精确搜索,需要使用双引号引起来:path:"/app/logs/nginx/access.log"
  • 如果不带引号,将会匹配每个单词:uid token
  • 模糊搜索:path:"/app/~"
  • * 匹配 0 到多个字符:*oken
  • ? 匹配单个字符:tok?n
  • 匹配是否包含的条件:
    • +:搜索结果中必须包含此项
    • -:不能含有此项
    • 什么都没有则可有可无:+token -appVersion appCode
  • 运算符 AND/OR/NOT 必须大写:token AND uidtoken OR uidNOT uid
  • 允许一个字段值在某个区间([] 包含该值,{} 不包含):@version:[1 TO 3]
  • 组合查询:(uid OR token) AND version
  • 转义特殊字符 + – && || ! ( ) { } [ ] ^ " ~ * ? : \:转义特殊字符只需在字符前加上符号 \

查询样例

简单查询

简单查询就是关键字匹配、字符串包含等,比如说如下语句会找出 name 字段是 banana 的所有数据:

1
name: banana

但是如果 name 包含 peachpeach test,然后下面两个语句查出来会是两个结果。

1
name: peach test

上述查询会将 namepeachnamepeach test 的都给查出来。

1
name: "peach test"

上述查询只会将 peach test 查出来,因为如果不加引号会自动关键字分词,将包含该关键字的所有数据匹配出来。

条件运算符

条件运算符就是 > >= < <=,在 KQL 里边都支持,使用也很简单,比如如下语句表示 age 字段大于等于 10:

1
age >= 10

逻辑运算符

查询语言自然少不了逻辑运算符与或非,在 KQL 中代表了 andornot

and 的用法:

1
age >= 10 and age < 100

上述语句表示查询出 age 在 10 到 100 的左开右闭区间中的所有数据。

or 的用法:

1
name: "Jeff" or name: "Kitty"

上述语句表示筛选出 name 包含 Jeff 或者 Kitty 关键字的所有数据。

not 的用法:

1
not age >= 10

上述语句表示筛选出 age 小于 10 的所有数据。

其中 and 的优先级比 or 的高:

1
age < 100 or name: wang and age >= 10

and 优先级高会先结合,所以意思是满足 name 是 wang 且 age >= 10,或者 age < 100

当然也可以通过小括号来改变优先级,比如:

1
(age < 100 or name: wang) and age >= 10

意思是 age >= 10 并且这条数据的 name 是 wang 或者 age < 100

同一字段运算符简写

可以用括号将多个逻辑运算符和条件合并到一起:

1
2
3
age = 10 or age = 100
# 等价于
age: (10 or 100)

通配符

通配符可以用于查找出存在某个 key 的数据:

1
name: *

表示查找出所有带 name 字段的数据。

1
system: win*

可以匹配到 system: win7system: win10 等。

字段嵌套查询

首先准备一个多层的数据,比如下面的这几条数据:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
{
"level1": [
{
"level2": [
{
"prop1": "foo",
"prop2": "bar"
},
{
"prop1": "baz",
"prop2": "qux"
}
]
}
]
}

比如想筛选 level1.level2.prop1 是 foo 或者是 baz 的,可以这样写:

1
level1.level2 { prop1: "foo" or prop1: "baz" }