Ich habe ein Problem mit der Score-Berechnung mit einer PrefixQuery. Um das Ergebnis jedes Dokuments zu ändern, habe ich beim Hinzufügen eines Dokuments in den Index setBoost verwendet, um den Boost des Dokuments zu ändern. Dann erstelle ich PrefixQuery für die Suche, aber das Ergebnis wurde nicht entsprechend dem Boost geändert. Es scheint, dass setBoost bei einer PrefixQuery nicht funktioniert. Bitte überprüfen Sie meinen Code unten:
%Vor%Die Ausgabe ist:
%Vor%PrefixQuery schreibt die Abfrage standardmäßig so um, dass sie ConstantScoreQuery verwendet, wodurch jedes einzelne übereinstimmende Dokument den Wert 1,0 erhält. Ich denke, das ist PrefixQuery schneller zu machen. So werden Ihre Boosts ignoriert.
Wenn Sie möchten, dass die Boosts in Ihrer PrefixQuery wirksam werden, müssen Sie setRewriteMethod () aufrufen, indem Sie die Konstante SCORING_BOOLEAN_QUERY_REWRITE für Ihre Präfixabfrage-Instanz verwenden. Siehe Ссылка .
Zum Debuggen können Sie searcher.explain () verwenden.
Es ist das erwartete Verhalten. Hier ist die Erklärung von Doug Cutting von Lucene Creator:
Eine PrefixQuery ist äquivalent zu einer Abfrage, die alle Begriffe enthält, die dem entsprechen Präfix, und enthält daher in der Regel viele Begriffe. Mit so einem großen Query, übereinstimmende Dokumente enthalten wahrscheinlich weniger der Suchbegriffe und das Spiel ist somit schwächer.
Lesen Sie den ursprünglichen Post , von dem das Zitat stammt.
Bei Lucene ist es im Allgemeinen besser, den Score nur als relatives Maß für die Relevanz in einer Reihe von Dokumenten zu verwenden. Der absolute Wert der Punktzahl ändert sich in Abhängigkeit von so vielen Faktoren, dass er nicht verwendet werden sollte.
UPDATE
Die Erklärung von Cutting bezieht sich auf eine ältere Version von Lucene. Daher ist die Antwort von bajafresh4life die richtige.
Ändern der Rewrite-Methode
Bajafresh4life schlug vor, setRewriteMethod
aufzurufen. Dies ändert sich jedoch nicht in Lucene.Net. So geht's in C #:
Standardmäßig wird jedes PrefixQuery
von der Methode NewPrefixQuery
von QueryParser
wie folgt zurückgegeben:
Sie können dies ändern, nachdem Sie Ihren Parser mit der set
-Eigenschaft von QueryParser.MultiTermRewriteMethod
instanziiert haben, etwa so:
Beachten Sie, dass dies das Verhalten auch für andere Abfragen ändert, nicht nur für die Präfixabfrage. Um nur die Präfixabfrage zu beeinflussen, können Sie QueryParser
ableiten und NewPrefixQuery
überschreiben, sodass der Konstruktor für das zurückgegebene PrefixQuery
die von Ihnen gewählte Methode zum erneuten Schreiben verwendet.
Zu verwendende Methode zum Umschreiben
Das scheint es jedoch nicht für mich zu reparieren. Ich hatte tatsächlich mehr Glück mit MultiTermQuery.CONSTANT_SCORE_BOOLEAN_QUERY_REWRITE
. In der Beschreibung für diese Methode heißt es:
Wie SCORING_BOOLEAN_QUERY_REWRITE mit Ausnahme von Scores werden nicht berechnet. Stattdessen erhält jedes übereinstimmende Dokument eine konstante Punktzahl, die der Erhöhung der Abfrage entspricht.
Aber das könnte daran liegen, dass ich auch PrefixQuery
subklassifiziert und ReWrite
überschrieben habe, um die gewünschten Ergebnisse als Boosts zuzuweisen.
Nach einiger Zeit des Debugging habe ich schließlich herausgefunden, dass SCORING_BOOLEAN_QUERY_REWRITE
, während ich versuchte, DefaultSimilarity.QueryNorm
zu verwenden, meine Ergebnisse störte, wenn der zurückgegebene Wert in Weight.Normalize
verwendet wird, der aufgerufen wird Query.Weight
.
Tags und Links java lucene lucene.net