[英]Lucene operator precedence for boolean operators
布爾運算符的運算順序是什么? 左到右? 右到左? 特定運營商有更高的優先級?
例如,如果我搜索:jakarta OR apache AND website
我能得到什么? 是“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);
...然后打印查詢的結果字符串表示形式。 +
運算符是“必需”運算符。 它:
要求字段中某處存在“+”符號后的項
缺少+
運算符意味着默認為“可能”,如“可能包含”——這意味着該術語是可選的:它不需要存在,如果查詢中有一些其他子句與文檔匹配。
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
和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
運算符的答案中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.