4 Stimmen

Lucene genaue Reihenfolge

Ich habe schon lange dieses Problem, dass ich nicht ganz verstehe, wie man eine vernünftige Lucene-Sortierung oder -Bewertung implementiert. Nehmen wir an, ich habe eine Liste von Städten und ihren Bevölkerungen. Wenn jemand nach "new" oder "london" sucht, möchte ich die Liste der Präfix-Treffer nach Bevölkerung sortiert haben, und das funktioniert mit einer Präfixsuche und einer Sortierung nach umgekehrtem Feld, wobei es ein Bevölkerungsfeld gibt, z. B. New Mexico, New York; oder London, Londonderry.

Allerdings möchte ich auch immer, dass der exakt übereinstimmende Name oben steht. Also sollte in dem Fall von "London" die Liste "London, London, Londonderry" anzeigen, wobei das erste London im Vereinigten Königreich ist und das zweite London in Connecticut, auch wenn Londonderry eine höhere Bevölkerung als London CT hat.

Hat jemand eine Lösung in Form einer einzelnen Abfrage?

3voto

Yuval F Punkte 20547

Dlamblin, lassen Sie mich sehen, ob ich das richtig verstanden habe: Sie möchten eine präfixbasierte Abfrage erstellen und dann die Ergebnisse nach Bevölkerung sortieren und möglicherweise die Sortierreihenfolge mit der Präferenz für exakte Treffer kombinieren. Ich schlage vor, die Suche von der Sortierung zu trennen und für die Sortierung einen CustomSorter zu verwenden: Hier ist ein Blog-Eintrag, der einen benutzerdefinierten Sortierer beschreibt. Das klassische Lucene-Buch beschreibt dies gut.

0 Stimmen

Vielen Dank für Ihren Blog-Beitrag, in dem erklärt wird, wie man einen Sortiervergleicher implementiert, der praktischerweise nicht das Definieren von 2 Klassen erfordert. Da der Sortiervergleicher jedoch nur auf zwei Dokumenten arbeiten kann, ohne den Suchbegriff zu kennen, kann er die Ergebnisse nicht so ranken, wie ich sie in meiner Frage beschrieben habe. Wie würde der Sortiervergleicher wissen, dass das Namensfeld "London" genau mit dem Suchbegriff "London" übereinstimmt, wenn er nicht auf den Suchbegriff zugreifen kann?

0 Stimmen

Ich glaube, du kannst folgendes tun: Die Klasse, die das ScoreDocComparator-Interface implementiert (AZ09Comparator im Beispiel im Blog), wird ein "Suchbegriff"-Mitglied haben, das festgelegt werden soll, wenn die Abfrage ausgeführt wird. Die Vergleichsmethode (compare() im Beispiel im Blog) kann auf dieses Feld zugreifen, während sie aufgerufen wird, und ein Dokument mit einer exakten Übereinstimmung höher einstufen als ein anderes, das keine exakte Übereinstimmung hat.

0 Stimmen

Dverdammt, das ist das, was ich bekomme, wenn ich nicht nachdenke (obwohl es schon eine Weile her ist, seit ich vor diesem Code stand). Jetzt macht das viel mehr Sinn und ist hilfreich.

1voto

Narayan Punkte 5755

API für

Sortcomparator

sagt

Es gibt ein eindeutiges Comparable für jeden eindeutigen Begriff im Feld - wenn einige Dokumente den gleichen Begriff im Feld haben, wird das Cache-Array Einträge haben, die auf das gleiche Comparable verweisen

Sie können einen

FieldSortedHitQueue

auf den Sortcomparator anwenden, der ein Comparator-Feld hat, für das die API sagt ...

Speichert einen Vergleich entsprechend jedem nach Feld sortierten Feld.

Daher kann der Begriff entsprechend sortiert werden

0voto

dlamblin Punkte 42420

Meine aktuelle Lösung besteht darin, einen exakten Sucher und einen Präfix-Sucher zu erstellen, die beide nach umgekehrter Bevölkerung sortiert sind, und dann alle meine Treffer abzukopieren, beginnend bei den exakten Treffern und dann zu den Präfix-Treffern zu wechseln. Die Ausgabe meiner Ergebnisse ist etwas lästiger, als ich denke, dass sie sein sollte.

Außerdem habe ich einen Hash verwendet, um Duplikate zu eliminieren, habe dann aber später den Präfix-Sucher in eine boolesche Abfrage eines Präfixsuche (MUSS) mit einer exakten Suche (MUSS NICHT) geändert, um Lucene die Duplikate entfernen zu lassen. Obwohl dies noch verschwenderischer schien.

Bearbeiten: In einen Kommentar verschoben (da die Funktion jetzt existiert): Yuval F Danke für Ihren Blogbeitrag ... Wie würde der Sortiervergleicher wissen, dass das Namensfeld "london" genau mit dem Suchbegriff "london" übereinstimmt, wenn er nicht auf den Suchbegriff zugreifen kann?

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