16 Stimmen

Wie sortiere ich Lucene Ergebnisse nach Feldwert mit einem HitCollector?

Ich verwende den folgenden Code, um eine Abfrage in Lucene.Net auszuführen

var collector = new GroupingHitCollector(searcher.GetIndexReader());
searcher.Search(myQuery, collector);
resultsCount = collector.Hits.Count;

Wie kann ich die Suchergebnisse nach einem Feld sortieren?


Update

Danke für Ihre Antwort . Ich hatte versucht, mit TopFieldDocCollector aber ich bekam eine Fehlermeldung, "value is too small or too large" als ich bestanden habe 5000 como numHits Argumentwert. Bitte schlagen Sie einen gültigen Wert zur Übergabe vor.

25voto

James Brady Punkte 22686

El search.Searcher.search Methode akzeptiert eine search.Sort Parameter, der so einfach aufgebaut sein kann wie:

new Sort("my_sort_field")

Es gibt jedoch einige Einschränkungen bei den Feldern, nach denen sortiert werden kann - sie müssen indiziert, aber nicht tokenisiert sein, und die Werte müssen konvertierbar sein in String s, Float s oder Integer s.

Lucene in Aktion deckt alle Details ab, ebenso wie die Sortierung nach mehreren Feldern und so weiter.

7 Stimmen

...und nicht tokenisiert - ich war schneller :)

0 Stimmen

@janwen Nach den Dokumenten für Lucene, ist es nicht erforderlich, dass der Wert gespeichert werden, nur indiziert

0voto

itsadok Punkte 27963

Was Sie suchen, ist wahrscheinlich TopFieldDocCollector . Verwenden Sie es anstelle des GroupingHitCollector (was ist das?), oder in ihm.

Kommentieren Sie dies, wenn Sie mehr Informationen benötigen. Ich helfe Ihnen gerne.

0 Stimmen

Danke für Ihre Antwort......... Ich hatte versucht, mit TopFieldDocCollector, aber ich bekam eine Fehlermeldung "Wert ist zu klein oder zu groß", wenn ich 5000 als numHits Argument Wert übergeben... bitte schlagen Sie einen gültigen Wert zu übergeben...

0voto

erickson Punkte 256579

In der ursprünglichen (Java-)Version von Lucene gibt es keine feste Beschränkung für die Größe der Datei TopFieldDocCollector Ergebnisse. Jede Zahl größer als Null wird akzeptiert. Obwohl Speicherbeschränkungen und Leistungseinbußen zu einer praktischen Grenze führen, die von Ihrer Umgebung abhängt, sind 5000 Treffer trivial und sollten außerhalb eines mobilen Geräts kein Problem darstellen.

Vielleicht bei der Portierung von Lucene, TopFieldDocCollector wurde geändert, um etwas anderes als die "Heap"-Implementierung von Lucene zu verwenden (genannt PriorityQueue , erweitert um FieldSortedHitQueue )-etwas, das die Größe der Ergebnisse unangemessen klein macht. Wenn dies der Fall ist, sollten Sie sich den Quellcode für TopFieldDocCollector und implementieren Sie Ihren eigenen ähnlichen Hit-Collector unter Verwendung einer besseren Heap-Implementierung.

Ich muss jedoch fragen, warum Sie versuchen, 5000 Ergebnisse zu sammeln? Kein Benutzer in einer interaktiven Anwendung wird so viele Ergebnisse sehen wollen. Ich gehe davon aus, dass Benutzer, die sich 200 Ergebnisse ansehen wollen, selten sind, aber verdoppeln Sie die Zahl auf 400, nur als Sicherheitsfaktor. Je nach Anwendung kann eine Begrenzung der Ergebnisgröße böswillige Screen Scraper behindern und auch Denial-of-Service-Angriffe abschwächen.

1 Stimmen

"Kein Benutzer in einer interaktiven Anwendung wird so viele sehen wollen" ist ein wenig anmaßend. Die Benutzer schreien und beschweren sich sogar, wenn wir aus legitimen technischen Gründen auf 200.000 kürzen...

0voto

toinetoine Punkte 392

Der Konstruktor für Sort, der nur den String-Feldnamen akzeptiert, wurde abgeschafft. Jetzt müssen Sie ein Sort-Objekt erstellen und es als letzten Parameter von searcher.Search()

/* sorting by a field of type long called "size" from greatest -> smallest 
(signified by passing in true for the last isReversed paramater)*/

Sort sorter = new Sorter(new SortField("size", SortField.Type.LONG, true))
searcher.Search(myQuery, collector, sorter);

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