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 时则不存在此功能。 (此功能需要“基本层”或更高级别。)
notion image

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 支持。
Nginx常用命令Elasticsearch系列:文档(Document)