4 Stimmen

Lucene-Abfrage-Analyseverhalten - Verbindung von Abfragebestandteilen mit UND

Sagen wir, wir haben einen Lucene-Index mit einigen indizierten Dokumenten, die mit StopAnalyzer.ENGLISH_STOP_WORDS_SET indiziert wurden. Ein Benutzer gibt zwei Abfragen ein:

  • foo:bar
  • baz:"there is"

Angenommen, die erste Abfrage liefert einige Ergebnisse, weil es Dokumente gibt, die der Abfrage entsprechen.

Die zweite Abfrage liefert 0 Ergebnisse. Der Grund dafür ist, dass bei der Analyse von baz:"there is" die Abfrage als nichtig endet, da sowohl there als auch is Stoppwörter sind (technisch gesehen wird dies in eine leere BooleanQuery umgewandelt, die keine Klauseln hat). Soweit so gut.

Jedoch verhalten sich alle folgenden kombinierten Abfragen genau gleich wie die Abfrage +foo:bar, das heißt, sie bringen einige Ergebnisse zurück - trotz des zweiten AND-Teils, der keine Ergebnisse liefert.

Man könnte argumentieren, dass bei einem UND beide Bedingungen erfüllt sein müssen, aber das sind sie nicht.

Es scheint widersprüchlich zu sein, da ein einzelner Abfragebestandteil je nach Kontext unterschiedliche Auswirkungen auf die Gesamtabfrage hat. Gibt es hierfür eine logische Erklärung? Kann dies auf irgendeine Weise angegangen werden, bevorzugt ohne die QueryAnalyzer selbst zu schreiben? Kann dies als Lucene-Bug klassifiziert werden?

Falls dies eine Rolle spielt, tritt das beobachtete Verhalten unter Lucene v3.0.2 auf.

Diese Frage wurde auch in der Lucene Java-Benutzer-Mailingliste veröffentlicht, bisher sind keine Antworten eingegangen.

0voto

Sindri Traustason Punkte 5225

Ich würde vorschlagen, den StopAnalyzer nicht zu verwenden, wenn Sie nach Sätzen wie "da ist" suchen möchten. StopAnalyzer ist im Wesentlichen eine verlustreiche Optimierungsmethode und es lohnt sich wahrscheinlich nicht, es zu verwenden, es sei denn, Sie indexieren riesige Textdokumente.

0voto

b.buchhold Punkte 3807

Ich denke, es ist völlig in Ordnung. Man kann sich das Ergebnis für eine leere Abfrage als die gesamte Dokumentensammlung vorstellen. Dieses Ergebnis wird jedoch aus praktischen Gründen ausgelassen. Im Wesentlichen bilden Sie also eine UND-Verknüpfung mit der Obermenge und nicht mit einer leeren Menge.

E: Man kann es sich so vorstellen, dass zusätzliche Schlüsselwörter das Ergebnis verfeinern. Dies ergibt am meisten Sinn, wenn man die Präfixsuche berücksichtigt. Je kürzer Ihr Präfix ist, desto mehr Treffer gibt es. Der extremste Fall wäre eine leere Abfrage, die die gesamte Dokumentensammlung abgleicht

0voto

mindas Punkte 25933

Erick Ericksson von der Lucene-Mailingliste hat einen Teil dieser Frage beantwortet:

Aber stellen Sie sich die Auswirkungen dessen vor, was Sie verlangen. Wenn alle Stoppwörter entfernt werden, würde keine Abfrage jemals Ihrer entsprechen. Das wäre meiner Meinung nach sehr kontraintuitiv. Ihre Benutzer haben keine Ahnung, dass Sie Stoppwörter entfernt haben, also werden sie dort sitzen und sagen: "Schau mal, ich WEISS, dass "bar" in foo war und ich WEISS, dass "es gibt" in baz war, warum zur Hölle hat dieses verfluchte System mein Dokument nicht gefunden?"

Es scheint also, dass der einzige vernünftige Weg ist, Stoppwörter nicht zu verwenden oder den Stoppwort-Satz zu reduzieren.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X