type
status
date
slug
summary
tags
category
icon
password
1、Kibana 搜索语法汇总
Kibana 支持三种搜索语法
- Lucene Query 语法
- KQL 语法
- 基于 JSON 的 Elasticsearch 查询 DSL
KQL 和 Lucene Query 总的来说差别不大,KQL更适合在 Kibana 中进行简单和常见的搜索和过滤操作,而 Lucene Query 语法则更适合在 Elasticsearch 中进行更复杂和高级的查询操作。DSL 语法相对复杂,但更强大,适合基于 Elasticsearch 的程序开发。推荐使用 Lucene Query 语法。
2、Lucene Query 语法
2.1 以Key:Value的形式构建查询条件
Key即是域名(Field), Value即是值项(Term)
默认域名可以省略掉,Lucene 的默认域是
text
域,kibana 的默认域是 message
域,message 包含所有日志内容。实例1:
上面这个表达式,会查询出response字段中包含200的文档对象,注意是包含,包含的是200这一个词,比如下面几种情况都会被查询出来
需要注意的是1200或者2001,是不能被查出来的。如果要查询1200或者2001,这种模糊匹配的,可以使用通配符,比如
response:*200
或者 response:200*
实例2:
上面这个表达式,是针对 message 字段进行搜索,在搜索的时候不会区分大小写,也就是说,Hello world YES 也是会被搜索出来的;
需要注意,上面的
"hello world yes"
使用了引号,这样的话这 3 个单词会被作为一个词进行查询,不会再进行分词,也就是说匹配的时候只会匹配 hello world yes 这样的顺序匹配,而不会匹配出 helllo yes world。实例3:
上面这个表达式,针对
message
字段进行搜索,搜索 message
中包含 hello
,或者包含 world
,或者两者都包含的情况;需要注意的是,不区分大小写,也不会保证顺序,也就是说,下面几种情况都会被匹配
2.2 对于数值项可以使用>、<、=操作符
2.3 多个查询项的组合,使用大写的 AND 、 OR 、NOT实现与或非
实例1:
上面这个条件,会查询 name 字段包含 jane,且 addr 字段包含 beijing 的记录。
实例2:
上面这个查询条件,会查询name字段包含jane,或者addr字段包含beijing的记录,或者两者都匹配;
实例3:
可以使用括号来控制匹配的优先级。
实例4:
上面这个表达式,会查询 response 包含200,或者 response 包含 404,或者包含 200 和 404 的记录(不保证顺序、不区分大小写)。
实例5:
上面这个查询条件,会查询出 response 字段中不包含 200 的记录。
实例6:
上面这个查询条件,会查询 response 包含 200,并且 message 不包含 yes 的记录。
实例7:
上面这个查询条件,会查询 response 包含 200,且 response 不包含 yes 的记录。
2.4 支持通配符
Kibana 一般不需要使用通配符,因为 Kibana 的 key:value 查询条件,只要域值包含 value 就能被搜索出来,除非我们的值项有多个特征,可以用通配符将多个特征连起来。
?
可以匹配任意一个字符
*
可以匹配任意多个字符
实例1:
上面这个查询条件,会返回 response 以 200 结尾的记录。
实例2:
上面这个查询条件,会返回所有包含 response 字段的记录。
实例3:
上面这个查询条件,会查询machine1字段,machine2字段...machinexyzabc 字段包含 hello 的数据记录,这里只是想表达,对于搜索的字段列,也是可以使用通配符的。
2.5 支持正则
ES 中正则性能很差,而且支持的功能也不是特别强大,尽量不要使用, 正则表达式需要用
//
括起来.2.6 范围限定
方括号
[]
代表包含边界值, 花括号 {}
代表不包含边界值3、KQL 和 Lucene Query 的差别
KQL(Kibana Query Language)和 Lucene 查询语法在一些方面有一些区别:
- 语法结构:KQL 使用更简洁和易于理解的语法结构,更接近自然语言,使得查询更易于编写和阅读。而 Lucene 查询语法则更为底层和灵活,需要更多的语法知识和操作。
- 功能支持:KQL 在 Kibana 中内置了一些特定的功能,如直接在编辑器窗口中生成和编辑代码、支持自动调试和代码库全局理解等。而Lucene查询语法则更通用,可以更灵活地构建复杂的查询。
- 可扩展性:Lucene 查询语法在 Elasticsearch 中更为底层,可以支持更多高级的查询操作和功能。而KQL是Kibana特定的查询语言,功能相对较为有限。
- 学习曲线:由于KQL的语法更简洁和易于理解,学习和使用起来相对较为容易。而Lucene查询语法需要更多的语法知识和经验,学习曲线相对较陡。
3.1 下拉建议
KQL 可以在您键入查询时获取有关字段、值和运算符的建议,而在使用 Lucene 时则不存在此功能。 (此功能需要“基本层”或更高级别。)

3.2 范围查询
KQL 和 Lucene Query 都支持 >、<、= 等操作符,另外 Lucene Query 还支持
field:[start TO end]
的格式来搜索字段中的范围。查找 count 大于或等于 5
查找 account_number 大于或等于 100,但小于 200
3.3 组合查询
KQL:
- bool 运算符 or 、and、not 和其大写版本( OR 、 AND 和 NOT )都有效。and 比 or 有更高的优先级,这是通常的运算符优先规则。
Lucene Query:
- Lucene 也支持 AND、OR 和 NOT ,但仅限大写。所以,如果你尝试使用 and ,它将被视为字面词。
- Lucene 推荐使用 + (条目必须存在) 和- (条目不能存在)。例如:brown +fox -news 指定 brown是可选的,fox 必须存在,并且 news 不得存在。
- Lucene 支持 &&、|| 和 ! 。
- 上面所有这些运算符都不遵守通常的运算符优先级规则,并建议在同时使用多个运算符时使用括号。
3.4 存在查询
查找包含字段 response 的文档
3.5 通配符
通配符的种类
- KQL:文档只提到了
*
通配符,匹配零个或多个字符,没有提到?
。
- Lucene:
*
通配符,匹配零个或多个字符。?
匹配单个字符。
通配符的转义
- KQL:将通配符用作通配符时从不需要转义通配符,因此我们可以使用类似
book.*:(quick or brown)
的内容
- Lucene:通配符作为字段名的一部分似乎需要转义。给出的例子是
book.\*:(quick OR brown)
3.6 嵌套查询
根据文档,嵌套查询的语法有所不同。
3.7 Lucene 的额外功能
KQL 文档没有提到正则表达式、模糊搜索和 boosting;所以它们可能不受支持。 Lucene 支持。
- Author:mcbilla
- URL:http://mcbilla.com/article/c2fc4238-1bd6-4c89-a042-925c54e2c8ad
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!