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?
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.
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
:
Die Verwendung dieser neuen Klasse ist der ursprünglichen sehr ähnlich, außer dass die Definition des Objekts sort
etwas anders ist:
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.
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.
Erstellen Sie einen Wrapper, der die Bewertung enthält und vergleichbar ist. Etwas wie:
%Vor%