首页 > 解决方案 > Lucene查询语言和KQL有什么区别

问题描述

Kibana ver >= 7.0 默认为搜索下拉菜单提供 KQL,但也支持似乎是旧的 Lucene 语法。尝试搜索时,它通常会令人讨厌地抱怨“您可能正在使用 Lucene,但选择了 KQL”。转到建议的链接:

我看不出有什么不同。它们之间的主要区别是什么?有人可以提供突出这些差异的查询示例吗?

标签: kibana

解决方案


KQLLucene 查询语法的当前文档显示了这两种查询的语法。我将总结主要区别:

1.下拉建议

似乎 KQL 可以在您键入查询时获取有关字段、值和运算符的建议,而使用 Lucene 时不存在此功能。(此功能需要“基本层”或以上。)

2. 范围查询

要查找count大于或等于的内容5:KQL 语法是count:>=5,而 Lucene 语法是count:[5 TO *]

要查找account_number大于或等于 100 但小于 200 的内容:KQL 语法是account_number:>=100 and account_number:<200,而 Lucene 语法是account_number:[100 TO 200}

3. 运营商

KQL 文档概述了布尔运算orandnot。大写版本(ORANDNOT也可以使用。文档指定and具有更高的优先级or,这是通常的运算符优先级规则。

Lucene 文档指定以下内容:

首选运算符是+(必须存在此术语)和-(不得存在此术语)。

例如,brown +fox -news指定brown是可选的、fox必须存在且news不得存在。

Lucene 也支持AND,ORNOT, 但只支持大写。因此,如果您尝试使用and,它将被视为字面意思。此外,Lucene 支持&&,||!. 但是,文档指出所有这些运算符都不遵守通常的运算符优先规则,并建议在多个运算符一起使用时使用括号。

4. 现有查询

要查找包含该字段response的文档:KQL 语法是response:*,而 Lucene 语法是_exists_:responseresponse:*也适用于 Lucene,但如果该字段的值为空字符串,则行为可能会有所不同)。

5. 通配符

对于 KQL,文档仅提及*匹配零个或多个字符的通配符。没有提到?,所以我认为它不存在。在 Lucene 中,?存在并匹配单个字符。

在 KQL 中,将通配符用作通配符时从不需要转义,所以我们可以有类似book.*:(quick or brown).在 Lucene 中,似乎需要将通配符用作字段名称的一部分时进行转义。给出的例子是book.\*:(quick OR brown)

6. 嵌套查询

根据文档,嵌套查询的语法似乎有所不同。

7. Lucene 的额外功能

KQL 文档没有提到正则表达式、模糊搜索和提升;所以它们可能不受支持。Lucene 支持它们。


推荐阅读