Frage

Ich füge Apache Lucene Unterstützung Querydsl (die Angebote der typsichere Abfragen für Java) und I habe Probleme zu verstehen, wie Lucene Abfragen vor allem in Bezug auf die Negation in verschachtelte Abfragen ausgewertet wird.

Zum Beispiel die folgenden zwei Abfragen meiner Meinung nach sind semantisch gleich, aber nur die ersten Ergebnisse zurückgibt.

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

Die vereinfachte Objektstruktur in dem zweiten Beispiel ist unten gezeigt.

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 eigener QueryParser scheint "AND (NOT" in die gleiche Art von Objekt Bäumen zu bewerten.

Ist das ein Fehler in Lucene oder habe ich das falsch verstanden Abfrageauswertung des Lucene? Ich bin glücklich, mehr Informationen bei Bedarf zu geben.

War es hilfreich?

Lösung

Sie sind nicht semantisch gleich.

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

Sie haben eine Unterabfrage, die nur eine NOT-Klausel hat. Was passiert ist, dass Lucene die

prüft
-title:"Jurassic Park"

Klausel und es zurückkehr 0 Dokumente. Dann Sie darauf hinweisen, dass die Unterabfrage erfolgen muss, und es Rückkehr Null Dokumente da, negiert er den Rest der Abfrage.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top