提问人:Doreen Miller 提问时间:12/16/2022 最后编辑:Raymond ChenDoreen Miller 更新时间:12/16/2022 访问量:310
布尔运算符的 Lucene 运算符优先级
Lucene operator precedence for boolean operators
问:
布尔运算符的运算顺序是什么?从左到右?从右到左?特定运营商的优先级更高?
例如,如果我搜索: jakarta OR apache AND 网站
我能得到什么?是吗 “jakarta”以及“apache”和“website”都有吗? 任何带有“网站”的东西也包含“jakarta”或“apache”? 别的?
答:
简短的回答:
在 Lucene 中,运算符优先于运算符。所以,你有效地做到了这一点:AND
OR
jakarta OR (apache AND website)
您可以通过解析查询字符串并查看它如何转换为“必需”和“可选”运算符来自行验证这一点。AND
OR
运算符优先于运算符,因为我们正在讨论优先权。NOT
AND
但是,在处理 Lucene 的所谓“布尔”运算符时,您需要非常小心,因为它们的行为方式与您基于其集体名称(“布尔值”)所期望的方式不同。
(不幸的是,我从未见过任何官方文件为这些优先规则提供引用 - 但我依赖于经验观察。有关更多信息,请参见下文。如果确实存在这方面的文档,那就太好了。
更长的答案
需要理解的一件关键事情是,Lucene 布尔运算符并不是真正的“布尔”,因为您可能认为,基于布尔代数,您使用括号来帮助避免歧义(或者您需要知道编程语言可能应用的规则) - 并且所有内容的计算结果都为 TRUE 或 FALSE。
Lucene 布尔运算符的作用略有不同。
他们不仅关心 TRUE/FALSE 纳入/排除,还关心如何对结果进行评分,以便相关性较高的结果比相关性较低的结果具有更高的分数。
Lucene 查询等效于以下内容:jakarta OR apache AND website
jakarta +apache +website
这意味着文档的字段必须包含 和 ,但也可以包含(以获得更高的相关性分数)。apache
website
jakarta
您可以通过获取原始查询字符串并对其进行解析来亲眼看到这一点:
Query query = parser.parse(queryString);
...然后打印查询的结果字符串表示形式。运算符是“必需”运算符。它:+
要求“+”符号后面的术语存在于字段中的某个位置
缺少运算符意味着“may”的默认值,如“may contain”——这意味着该术语是可选的:如果查询中有一些其他子句与文档匹配,则不需要存在。+
使用强制要求任何一方的条款。AND
AND
您可能会遇到一些可能令人惊讶的情况。
考虑一下:
foo AND bar OR baz AND bat
这将解析为以下内容:
+foo +bar +baz +bat
这是因为运算符被转换为每个项的运算符,从而使运算符变得多余。AND
+
OR
这与你写这个的结果是一样的:
foo AND bar AND baz AND bat
但与此不同:
(foo AND bar) OR (baz AND bat)
它被解析为这个,其中保留了括号:
(+foo +bar) (+baz +bat)
底线:
使用括号明确表达您的意图,在使用 and 和 时。AND
OR
NOT
关于,既然我们提到过它 - 那需要优先。NOT
AND
查询:
foo AND bar NOT baz AND bat
解析为:
+foo +bar -baz +bat
因此,文档字段必须包含 和 - ,并且不得包含 。foo
bar
bat
baz
为什么会出现这种情况?
我不知道,但我认为 Lucene 最初不包括 和 - 而是使用了(必须包括)、(不得包括)和“无”(可能包括)。后来又添加了所谓的布尔运算符,作为这些原始运算符的一种“句法糖”——为更熟悉 、 和其他上下文的人引入。我基于以下线程:AND
OR
NOT
+
-
AND
OR
NOT
AND
OR
NOT
该线程的摘要包含在有关运算符的答案中。NOT
下一个:生成真值表
评论