Wie sortieren Sie Suchergebnisse in mehreren Feldern mit einer Gewichtungsfunktion?

8

Ich habe einen Lucene-Index, in dem jedes Dokument mehrere Felder enthält, die numerische Werte enthalten. Jetzt möchte ich das Suchergebnis nach einer gewichteten Summe dieses Feldes sortieren. Zum Beispiel:

%Vor%

Und die Gewichtungsfunktion sieht folgendermaßen aus:

%Vor%

Die Ergebnisse sollten nach f (d) geordnet sein, wobei d für das Dokument steht. Die Sortierfunktion sollte nicht statisch sein und sich von Suche zu Suche unterscheiden, da die konstanten Faktoren vom Benutzer, der die Suche durchführt, beeinflusst werden.

Hat jemand eine Idee, wie man das löst oder vielleicht eine Idee, wie man dieses Ziel auf eine andere Weise erreichen kann?

    
Chris 03.05.2009, 21:05
quelle

4 Antworten

13

Sie könnten versuchen, eine benutzerdefinierte ScoreDocComparator zu implementieren . Zum Beispiel:

%Vor%

Hier ist ein Beispiel für ScaledScoreDocComparator in Aktion. Ich glaube, es funktioniert in meinem Test, aber ich ermutige Sie, es gegen Ihre Daten zu beweisen.

%Vor%

Bonus!

Es scheint, dass die Lucene-Entwickler die Schnittstelle ScoreDocComparator ablehnen (sie ist im Subversion-Repository derzeit veraltet). Hier ist ein Beispiel für ScaledScoreDocComparator , das so geändert wurde, dass es dem Nachfolger von ScoreDocComparator folgt, FieldComparator :

%Vor%

Die Verwendung dieser neuen Klasse ist der ursprünglichen sehr ähnlich, außer dass die Definition des Objekts sort etwas anders ist:

%Vor%     
Adam Paynter 05.05.2009, 16:07
quelle
0

Ich denke, eine Möglichkeit wäre, dies als Parameter für Ihre Sortierfunktion zu akzeptieren:

Anzahl der Felder, Array der Dokumente, Liste der Gewichtungsfaktoren (basierend auf der Anzahl der Felder)

Berechnen Sie die Gewichtungsfunktion für jedes Dokument und speichern Sie das Ergebnis in einem separaten Array in der gleichen Reihenfolge wie das Dokumenten-Array. Führen Sie dann jede gewünschte Sortierung durch (schnelle Sortierung wäre wahrscheinlich die beste), und stellen Sie sicher, dass Sie nicht nur das f (d) -Array, sondern auch das Dokumenten-Array sortieren. Geben Sie das sortierte Dokumenten-Array zurück und Sie sind fertig.

    
AlbertoPL 04.05.2009 00:35
quelle
0

Implementieren Sie Ihre eigene Ähnlichkeitsklasse und überschreiben Sie idf (Term, Searcher) Methode. In dieser Methode können Sie die Punktzahl wie folgt zurückgeben. if (term.field.equals ("field1") {

%Vor%

Wenn Sie die Abfrage ausführen, vergewissern Sie sich, dass sie in allen Feldern vorhanden ist. Die Abfrage sollte so aussehen wie

  

field1: Begriff field2: Begriff field3: Begriff

Das Endergebnis wird außerdem basierend auf der Normalisierung der Abfrage einige Gewichtungen hinzufügen. Dies hat jedoch keinen Einfluss auf die relative Reihenfolge der Dokumente gemäß der von Ihnen angegebenen Gleichung.

    
Shashikant Kore 04.05.2009 11:35
quelle
0

Erstellen Sie einen Wrapper, der die Bewertung enthält und vergleichbar ist. Etwas wie:

%Vor%     
Peter Lawrey 04.05.2009 12:10
quelle

Tags und Links