Lucene查询中的双重否定

时间:2014-04-30 11:29:44

标签: solr lucene solr-query-syntax

假设我有一个二进制字段已检查 让我们假设已经检查了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查询解析行为如此奇怪

2 个答案:

答案 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类来完成它,该类执行必要的操作。