0
点赞
收藏
分享

微信扫一扫

Kibana查询语言(KQL)AND、OR匹配,模糊匹配


一. 前言

现在大多数的公司都会使用​​ELK组合​​​来对日志数据的收集、存储和提供查询服务。​​ElasticSearch​​​ + ​​Logstash​​​+ ​​Kibana​​。

查询数据库,如果是​​MySQL​​​,那么就需要使用​​MySQL​​​的语法;同样的,在​​Kibana​​​上查询数据,也需要使用​​Kibana​​​的语法,而​​Kibana​​​的查询语法叫做​​Kibana Query Language​​​,简称​​KQL​​。

二. KQL简单介绍

KQL(Kibana Query Language),也就是在Kibana上面进行查询时使用的语法。

​Kibana​​​中也可以使用​​Lucene​​​的查询语法,但是这里就不介绍了,可以参考​​https://www.elastic.co/guide/en/kibana/7.7/lucene-query.html​​

三. 使用索引匹配查询

​ 在​​Kibana​​中进行查询的时候,建议使用指定索引查询,这样的效率更高,而不建议使用全局查找的方式。

比如查找​​response​​​为​​200​​​的日志,那么就写为​​response:200​​​,这样去查找中​​response​​值包含​200​​这个的文档对象;

如果没有指定​​response​​​为​​200​​​,那么只是单纯的查找​​200​​​,那么可能会返回金额为​​200​​的文档对象(假设有金额字段),查询的效率不高,同时也会返回一些不需要的数据;

四. Kibana查询语法

实例1

response:200

上面这个表达式,会查询出​​response​​字段中包含​200​​​的文档对象,注意是包含,包含的是​​200​​这一个词,比如下面几种情况都会被查询出来

200
hello world 200
hello 200 world

需要注意的是​​1200​​​或者​​2001​​,是不能被查出来的。

如果要查询​​1200​​​或者​​2001​​​,这种模糊匹配的,可以使用通配符,比如 ​​response:*200 ​​​或者​​ response:200*​

实例2

message:"hello world yes"

上面这个表达式,是针对​​message​​​字段进行搜索,在搜索的时候不会区分大小写,也就是说,​​Hello world YES​​也是会被搜索出来的;

需要注意,上面的​​"hello world yes"​​使用了引号,这样的话,这3个单词会被作为一个词进行查询,不会再进行分词,也就是说匹配的时候只会匹配​​hello world yes​​​这样的顺序匹配,而不会匹配出​​helllo yes world​​;

实例3

message:hello world

上面这个表达式,针对​​message​​​字段进行搜索,搜索​​message​​中包含​hello​​,或者包含​world​​,或者两者都包含的情况;

需要注意的是,不区分大小写,也不会保证顺序,也就是说,下面几种情况都会被匹配

hello
world
Hello
World
hello world
Hello world
hello yes World
yes world
world yes

实例4

name:jane or addr:beijing

上面这个查询条件,会查询​​name​​​字段包含​​jane​​​,或者​​addr​​​字段包含​​beijing​​的记录,或者两者都匹配;

需要注意的是,​​or​​​表示 ​​ “或”​​ ,不区分大小写;

实例5

name:jane and addr:beijing

上面这个条件,会查询​​name​​​字段包含​​jane​​​,且​​addr​​​字段包含​​beijing​​的记录。

实例6

name:jane and addr:beijing or job:teacher

上面这个查询条件中,出现了​​and​​​和​​or​​​,需要记住的是,​​KQL​​​中,​​and​​​的优先级高于​​or​​;

所以上面的查询条件,会查询​​name​​​包含​​jane​​​,且​​addr​​​包含​​beijing​​​的记录,或者​​job​​​包含​​teacher​​的记录,可以使用括号来让上面的查询条件更好理解:

(name:jane and addr:beijing) or job:teacher

实例7

name:jane and (addr:beijing or job:teacher)

上面这个表达式,主要是想表明,可以使用括号来控制匹配的优先级。

实例8

response:(200 or 404)

上面这个表达式,会查询​​response​​​包含​​200​​​,或者​​response​​​包含​​404​​​,或者包含​​200​​​和​​404​​的记录(不保证顺序、不区分大小写);

同时可以使用​​and​​​来表示 ​​“且” ​​的关系。

实例9

not response:200

上面这个查询条件,会查询出​​response​​​字段中不包含​​200​​的记录。

实例10

response:200 and not yes

上面这个查询条件,会查询​​response​​​包含​​200​​​,并且整条记录不包含​​yes​​的数据记录;

实例11

response:(200 and not yes)

上面这个查询条件,会查询​​response​​​包含​​200​​​,且​​response​​​不包含​​yes​​的记录。

实例12

response:*

上面这个查询条件,会返回所有包含​​response​​字段的文档对象。

实例13

machine*:hello

上面这个查询条件,会查询​​machine1​​​字段,​​machine2​​​字段​​...machinexyzabc​​​字段包含​​hello​​的数据记录,这里只是想表达,对于搜索的字段列,也是可以使用通配符的。

五.总结

​KQL​​​还是比较简单地,主要记住​​KQL​​匹配时是不区分大小写的,可以使用括号改变匹配优先级

另外一个要点就是,匹配是 包含,某个字段“包含”某个词,而不是某个字段的值为某个词



举报

相关推荐

0 条评论