Lucene die verschachtelte Abfrage Auswertung bezüglich Negation
-
20-09-2019 - |
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.
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.