假设我有一个二进制字段已检查 让我们假设已经检查了3个文件中的3个:检查了其他1个文件:0
当我在lucene中搜索时
checked:1 - returns correct result (3)
checked:0 - returns correct result (7)
-checked:1 - returns correct result (7)
-checked:0 - returns correct result (3)
BUT
-(-(checked:1)) - suddenly returns wrong result (10, i.e. entire data set).
任何想法为什么lucene查询解析行为如此奇怪
答案 0 :(得分:2)
每个Lucene查询必须包含至少一个正项(MUST / +或SHOULD),因此它至少匹配一个文档。因此,您的查询-checked:1
和-checked:0
无效,我很惊讶您正在获取任何结果。
这些查询应该(很可能)如下所示:
+*:* -checked:1
+*:* -checked:0
回到你的问题:在Lucene中双重否定makes no sense。为什么你会有双重否定,你想要查询什么?
一般来说,不要将Lucene查询运算符(!& |)看作布尔运算符they aren't exactly what you think they are。
答案 1 :(得分:1)
经过一些研究和反复试验并积累了来自midas的答案后,我想出了解决这种不一致的方法。当我说不一致时,我的意思是从用户的常识视角。从信息检索的角度来看,midas已经链接了一篇有趣的文章,该文章解释了为什么这样的查询毫无意义。 因此,诀窍是将每个否定表达式保留为MatchAllDocsQueryNode类,即重写的查询必须如下所示:
-(-(checked:1 *:*) *:*)
然后查询将产生预期的结果。我通过编写自己的nodeprocessor类来完成它,该类执行必要的操作。