1

Apache LuceneサポートをQuerydsl (Java のタイプ セーフ クエリを提供)に追加していますが、特にネストされたクエリの否定に関して、Lucene がクエリを評価する方法を理解するのに問題があります。

たとえば、私の意見では、次の 2 つのクエリは意味的に同じですが、最初のクエリだけが結果を返します。

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

2 番目の例の簡略化されたオブジェクト ツリーを以下に示します。

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 句が 1 つしかないサブクエリがあります。何が起きているかというと、Lucene が

-title:"Jurassic Park"

節であり、0 個のドキュメントを返しています。次に、サブクエリが発生する必要があることを示しており、ゼロのドキュメントが返されるため、クエリの残りを否定します。

于 2010-03-18T13:31:36.857 に答える