1

我正在向Querydsl (它为 Java 提供类型安全的查询)添加Apache Lucene支持,但我在理解 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 中的错误还是我误解了 Lucene 的查询评估?如有必要,我很乐意提供更多信息。

4

1 回答 1

3

它们在语义上并不相同。

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

您有一个只有一个 NOT 子句的子查询。发生的事情是 Lucene 正在评估

-title:"Jurassic Park"

子句,它返回 0 个文档。然后您表明子查询必须发生,并且由于它返回零个文档,因此它否定了查询的其余部分。

于 2010-03-18T13:31:36.857 回答