我加入阿帕奇Lucene的以支持 Querydsl (提供类型安全的查询的Java)和我时遇到理解的Lucene如何评估特别是关于在嵌套查询的否定的查询的问题。

例如,在我的意见以下两个查询在语义上是相同的,但是只有第一个返回结果。

+year:1990 -title:"Jurassic Park"
+year:1990 +(-title:"Jurassic Park")

在第二实施例中的简化的对象树如下所示。

query : Query
  clauses : ArrayList
    [0] : BooleanClause
      "MUST" occur : BooleanClause.Occur
      "year:1990" query : TermQuery
    [1] : BooleanClause
      "MUST" occur : BooleanClause.Occur
      query : BooleanQuery
        clauses : ArrayList
          [0] : BooleanClause
            "MUST_NOT" occur : BooleanClause.Occur
            "title:"Jurassic Park"" query : TermQuery

Lucene的自己QueryParser似乎评估"AND (NOT"到同一类型的对象树。

这是在Lucene的BUG或者有我误解了Lucene的查询评估?我很高兴,如果有必要提供更多的信息。

有帮助吗?

解决方案

它们不是语义上是相同的。

+year:1990 +(-title:"Jurassic Park")

您有一个子查询只有一个NOT子句。发生了什么事是,Lucene是评估

-title:"Jurassic Park"

子句和它的返回0的文件。然后,就表示必须发生的子查询,并且因为它是返回零个文件,它否定了查询的其余部分。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top