【问题标题】:Lucene's nested query evaluation regarding negationLucene 关于否定的嵌套查询评估
【发布时间】:2011-01-28 23:22:41
【问题描述】:

我正在将 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 的查询评估?如有必要,我很乐意提供更多信息。

【问题讨论】:

    标签: java lucene type-safety querydsl


    【解决方案1】:

    它们在语义上并不相同。

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

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

    -title:"Jurassic Park"
    

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

    【讨论】:

    • 非常感谢,现在非常有意义。
    • 好的,..这似乎是有道理的。但是如果 (-title:"Jurassic Park") 返回了超过 1 个文档怎么办..这是否意味着,如果 +year:1990 出现在该文档中,则只有该文档将作为命中提供??..看起来像那样.. .只是想多了解一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-09
    • 2015-01-19
    相关资源
    最近更新 更多