1

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

4

2 回答 2

2

每个 Lucene 查询必须包含至少一个肯定词(必须/+ 或应该),因此它至少匹配一个文档。所以你的查询-checked:1-checked:0无效,我很惊讶你得到任何结果。

这些查询应该(很可能)如下所示:

  • +*:* -checked:1
  • +*:* -checked:0

回到你的问题:双重否定在 Lucene 中没有意义。为什么你会有双重否定,你想查询什么?

一般来说,不要将 Lucene 查询运算符 (! & |) 视为布尔运算符,它们并不完全是您认为的那样

于 2014-04-30T11:54:06.080 回答
1

经过一些研究和反复试验并建立了midas的答案,我想出了解决这种不一致的方法。当我说不一致时,我的意思是从用户的常识角度来看。从信息检索的角度来看,midas 链接了一篇有趣的文章,这解释了为什么这样的查询没有意义。因此,诀窍是使用MatchAllDocsQueryNode类保留每个否定表达式,即重写的查询必须如下所示:

 -(-(checked:1 *:*) *:*)

然后查询将产生预期的结果。我通过编写自己的 nodeprocessor 类来完成它,该类执行必要的操作。

于 2014-06-18T13:06:54.243 回答