Lucene查询语言和KQL有什么区别

What is the difference between Lucene query language and KQL

Kibana 版本 >= 7.0 默认为搜索下拉菜单提供 KQL,但也支持似乎是旧的 Lucene 语法。 它经常在尝试搜索时恼人地抱怨 "You might be using Lucene but KQL is selected"。 转到建议的链接:

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

KQL and Lucene query syntax 的当前文档显示了两种查询的语法。我将总结主要区别:

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 文档指定了以下内容:

The preferred operators are + (this term must be present) and - (this term must not be present).

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

Lucene 还支持 ANDORNOT,但只支持大写。因此,如果您尝试使用 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 支持它们。