本文由 简悦 SimpRead 转码, 原文地址 www.tuicool.com
一. 前言
现在大多数的公司都会使用 ELK 组合来对日志数据的收集、存储和提供查询服务,这里就不介绍什么是 ELK 了,只介绍一些 EKL 中的查询,也就是 K(kibana)。
查询数据库,如果是 MySQL,那么就需要使用 MySQL 的语法;同样的,在 Kibana 上查询数据,也需要使用 Kibana 的语法,而 Kibana 的查询语法叫做 Kibana Query Language,简称 KQL。
本文的内容主要来自 ES 的官网,简单翻译了一下,https://www.elastic.co/guide/en/kibana/7.7/kuery-query.html
原文链接: https://www.cnblogs.com/-beyond/p/14159002.html
二. 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 这一个词,比如下面几种情况都会被查询出来
hello world 200
hello 200 world
需要注意的是 1200 或者 2001,是不能被查出来的。
实例 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 匹配时是不区分大小写的,可以使用括号改变匹配优先级;
另外一个要点就是,匹配是 “包含”,某个字段“包含” 某个词,而不是某个字段的值为某个词。
原文链接: https://www.cnblogs.com/-beyond/p/14159002.html
参考文献: