代码之家  ›  专栏  ›  技术社区  ›  ponzao

Lucene关于否定的嵌套查询求值

  •  1
  • ponzao  · 技术社区  · 16 年前

    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中的bug还是我误解了Lucene的查询求值?如果有必要,我很乐意提供更多的信息。

    1 回复  |  直到 16 年前
        1
  •  3
  •   bajafresh4life    16 年前

    它们在语义上不一样。

    在里面

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

    您的子查询只有一个NOT子句。Lucene正在评估

    -title:"Jurassic Park"
    

    子句并返回0个文档。然后您指出子查询必须发生,因为它返回零个文档,所以它否定查询的其余部分。