Lucene关于否定的嵌套查询评估

时间:2010-03-18 10:46:58

标签: java lucene type-safety querydsl

我正在为Apache 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中的错误还是我误解了Lucene的查询评估?如有必要,我很乐意提供更多信息。

1 个答案:

答案 0 :(得分:3)

它们在语义上并不相同。

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

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

-title:"Jurassic Park"

子句,它返回0个文件。然后你指出子查询必须出现,并且由于它返回零文档,它否定了查询的其余部分。