Lucene: Ergebnisberechnung mit einer PrefixQuery

8

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%     
Keven 17.06.2010, 10:02
quelle

3 Antworten

11

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.

    
bajafresh4life 17.06.2010 14:59
quelle
2

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.

    
Pascal Dimassimo 17.06.2010 13:13
quelle
0

Ä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:

%Vor%

Sie können dies ändern, nachdem Sie Ihren Parser mit der set -Eigenschaft von QueryParser.MultiTermRewriteMethod instanziiert haben, etwa so:

%Vor%

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 .

    
DCShannon 03.02.2015 21:00
quelle

Tags und Links