簡體   English   中英

布爾運算符的 Lucene 運算符優先級

[英]Lucene operator precedence for boolean operators

布爾運算符的運算順序是什么? 左到右? 右到左? 特定運營商有更高的優先級?

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

我能得到什么? 是“jakarta”的任何內容,還是“apache”和“website”的任何內容? 任何帶有“網站”的東西也有“jakarta”或“apache”? 還有別的嗎?

簡短回答:

在 Lucene 中, AND運算符優先於OR運算符。 所以,你實際上是在這樣做:

jakarta OR (apache AND website)

您可以通過解析查詢字符串並查看它如何將ANDOR轉換為“必需”和“可選”運算符來自行驗證這一點。

NOT運算符優先於AND運算符,因為我們正在討論優先級。

但是在處理 Lucene 的所謂“布爾”運算符時您需要非常小心,因為它們的行為方式與您基於它們的統稱(“布爾”)所期望的不同。

(不幸的是,我從未見過任何官方文檔為這些優先規則提供引用 - 但我依賴於經驗觀察。有關更多信息,請參見下文。如果確實存在這方面的文檔,那將是很高興看到的。)


更長的答案

需要理解的一個關鍵點是,Lucene 布爾運算符並不是真正意義上的“布爾”,基於布爾代數,您可能會在其中使用括號來幫助避免歧義(或者您需要知道編程語言可能遵循的規則)正在申請) - 以及所有評估結果為 TRUE 或 FALSE 的地方。

Lucene 布爾運算符的用途略有不同。

他們不僅僅關心 TRUE/FALSE 包含/排除,關心如何對結果進行評分,以便更相關的結果比不太相關的結果獲得更高的分數。

Lucene 查詢jakarta OR apache AND website等同於:

jakarta +apache +website

這意味着文檔的字段必須包含apachewebsite ,但也可能包含jakarta (以獲得更高的相關性分數)。

您可以通過獲取原始查詢字符串並對其進行解析來親自查看:

Query query = parser.parse(queryString);

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

要求字段中某處存在“+”符號后的項

缺少+運算符意味着默認為“可能”,如“可能包含”——這意味着該術語是可選的:它不需要存在,如果查詢中有一些其他子句與文檔匹配。

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)

底線:

在使用ANDOR以及NOT時,使用括號明確表達您的意圖。


關於NOT ,因為我們提到過它 - 它優先於AND

查詢:

foo AND bar NOT baz AND bat

被解析為:

+foo +bar -baz +bat

因此,文檔字段必須包含foobarbat - 並且不得包含baz


為什么會出現這種情況?

我不知道,但我認為Lucene 最初不包括ANDORNOT - 而是使用+ (必須包括), - (不得包括)和“無”(可能包括)。 后來添加了所謂的布爾運算符ANDORNOT ,作為這些原始運算符的一種“語法糖”——為那些在其他情況下更熟悉ANDORNOT的人引入。 我基於以下線程:

更好地理解 Lucene 的搜索運算符

該線程的摘要包含在這個關於NOT運算符的答案中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM