布尔运算符的 Lucene 运算符优先级

Lucene operator precedence for boolean operators

提问人:Doreen Miller 提问时间:12/16/2022 最后编辑:Raymond ChenDoreen Miller 更新时间:12/16/2022 访问量:310

问:

布尔运算符的运算顺序是什么?从左到右?从右到左?特定运营商的优先级更高?

例如,如果我搜索: jakarta OR apache AND 网站

我能得到什么?是吗 “jakarta”以及“apache”和“website”都有吗? 任何带有“网站”的东西也包含“jakarta”或“apache”? 别的?

Lucene 运算符优先级布尔 逻辑

评论

0赞 Bagus Tesa 12/16/2022
欢迎来到 StackOverflow!运算符优先级是否取决于您使用的查询解析器?
0赞 Ermac 12/16/2022
嗨,这可能取决于编程语言,但我认为通常 AND 优先于 OR,所以你的句子相当于:jakarta OR(apache AND 网站)

答:

1赞 andrewJames 12/16/2022 #1

简短的回答:

在 Lucene 中,运算符优先于运算符。所以,你有效地做到了这一点:ANDOR

jakarta OR (apache AND website)

您可以通过解析查询字符串并查看它如何转换为“必需”和“可选”运算符来自行验证这一点。ANDOR

运算符优先于运算符,因为我们正在讨论优先权。NOTAND

但是,在处理 Lucene 的所谓“布尔”运算符时,您需要非常小心,因为它们的行为方式与您基于其集体名称(“布尔值”)所期望的方式不同。

(不幸的是,我从未见过任何官方文件为这些优先规则提供引用 - 但我依赖于经验观察。有关更多信息,请参见下文。如果确实存在这方面的文档,那就太好了。


更长的答案

需要理解的一件关键事情是,Lucene 布尔运算符并不是真正的“布尔”,因为您可能认为,基于布尔代数,您使用括号来帮助避免歧义(或者您需要知道编程语言可能应用的规则) - 并且所有内容的计算结果都为 TRUE 或 FALSE。

Lucene 布尔运算符的作用略有不同。

他们不仅关心 TRUE/FALSE 纳入/排除,关心如何对结果进行评分,以便相关性较高的结果比相关性较低的结果具有更高的分数。

Lucene 查询等效于以下内容:jakarta OR apache AND website

jakarta +apache +website

这意味着文档的字段必须包含 和 ,但也可以包含(以获得更高的相关性分数)。apachewebsitejakarta

您可以通过获取原始查询字符串并对其进行解析来亲眼看到这一点:

Query query = parser.parse(queryString);

...然后打印查询的结果字符串表示形式。运算符是“必需”运算符。它:+

要求“+”符号后面的术语存在于字段中的某个位置

缺少运算符意味着“may”的默认值,如“may contain”——这意味着该术语是可选的:如果查询中有一些其他子句与文档匹配,则不需要存在。+

使用强制要求任何一方的条款。ANDAND


您可能会遇到一些可能令人惊讶的情况。

考虑一下:

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 和 时。ANDORNOT


关于,既然我们提到过它 - 那需要优先。NOTAND

查询:

foo AND bar NOT baz AND bat

解析为:

+foo +bar -baz +bat

因此,文档字段必须包含 和 - ,并且不得包含 。foobarbatbaz


为什么会出现这种情况?

我不知道,但我认为 Lucene 最初不包括 和 - 而是使用了(必须包括)、(不得包括)和“无”(可能包括)。后来又添加了所谓的布尔运算符,作为这些原始运算符的一种“句法糖”——为更熟悉 、 和其他上下文的人引入。我基于以下线程:ANDORNOT+-ANDORNOTANDORNOT

更好地了解 Lucene 的搜索运算符

该线程的摘要包含在有关运算符的答案中。NOT