kibana - Lucene查询语言和KQL有什么区别
问题描述
Kibana ver >= 7.0 默认为搜索下拉菜单提供 KQL,但也支持似乎是旧的 Lucene 语法。尝试搜索时,它通常会令人讨厌地抱怨“您可能正在使用 Lucene,但选择了 KQL”。转到建议的链接:
- https://www.elastic.co/guide/en/kibana/7.7/lucene-query.html
- https://www.elastic.co/guide/en/kibana/7.7/kuery-query.html
我看不出有什么不同。它们之间的主要区别是什么?有人可以提供突出这些差异的查询示例吗?
解决方案
KQL和Lucene 查询语法的当前文档显示了这两种查询的语法。我将总结主要区别:
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 文档概述了布尔运算or
符and
和not
。大写版本(OR
和AND
)NOT
也可以使用。文档指定and
具有更高的优先级or
,这是通常的运算符优先级规则。
Lucene 文档指定以下内容:
首选运算符是
+
(必须存在此术语)和-
(不得存在此术语)。
例如,brown +fox -news
指定brown
是可选的、fox
必须存在且news
不得存在。
Lucene 也支持AND
,OR
和NOT
, 但只支持大写。因此,如果您尝试使用and
,它将被视为字面意思。此外,Lucene 支持&&
,||
和!
. 但是,文档指出所有这些运算符都不遵守通常的运算符优先规则,并建议在多个运算符一起使用时使用括号。
4. 现有查询
要查找包含该字段response
的文档:KQL 语法是response:*
,而 Lucene 语法是_exists_:response
(response:*
也适用于 Lucene,但如果该字段的值为空字符串,则行为可能会有所不同)。
5. 通配符
对于 KQL,文档仅提及*
匹配零个或多个字符的通配符。没有提到?
,所以我认为它不存在。在 Lucene 中,?
存在并匹配单个字符。
在 KQL 中,将通配符用作通配符时从不需要转义,所以我们可以有类似book.*:(quick or brown).
在 Lucene 中,似乎需要将通配符用作字段名称的一部分时进行转义。给出的例子是book.\*:(quick OR brown)
。
6. 嵌套查询
根据文档,嵌套查询的语法似乎有所不同。
7. Lucene 的额外功能
KQL 文档没有提到正则表达式、模糊搜索和提升;所以它们可能不受支持。Lucene 支持它们。
推荐阅读
- r - 查找列表中满足R中条件的元素的索引
- tensorflow - 在 TensorFlow 图中更改一种节点类型
- javascript - CSS 没有在 webpack 项目中立即加载
- java - 如何将 2 条记录(多对一)的 Result 对象映射到 jOOQ 中它们各自的记录对象中?
- f# - 如何转换任务序列
到 MyType 的序列 - c# - 如何在 MVC 应用程序和控制台应用程序之间共享信息
- c++ - 是否有必要在没有子类构造函数的参数的情况下调用父构造函数?
- c# - 对列表中的重复数据进行分组和删除c#
- android - 如何从 Activity 更新片段 TextView?
- reactjs - 构建成功,没有错误但白屏