2016-04-09 21 views
2

Ich bin derzeit in Lucene und fragte mich, was ist der beste Weg, um eine Suche, die mit der org.apache.lucene.search.IndexSearcher durchgeführt wird, abzubrechen?Lucene: Was ist der richtige Weg, um eine Suche abzubrechen?

Ich kann mir vorstellen, einfach Interrupt auf den Thread, den ich für die Suche erstellt habe, aufzurufen, aber ich bin mir nicht sicher, ob die relevanten Komponenten innerhalb Lucene auf Unterbrechung reagieren (ohne durch die Tiefen des Quellcodes zu suchen).

Gibt es einen "offiziellen" Weg/was wäre der beste Weg?

Mit freundlichen Grüßen

Antwort

3

IndexSearcher bietet einen Konstruktor mit einem ExecutorService als Parameter (den Link im Konstruktor für ein Beispiel für die Verwendung folgen). Dies kann verwendet werden, um die Suche zu beenden. Beachten Sie jedoch die Anmerkung zur Verwendung von NIOFSDirectory.

Siehe https://lucene.apache.org/core/6_0_0/core/org/apache/lucene/search/IndexSearcher.html

Und https://issues.apache.org/jira/browse/LUCENE-2239

Auszug aus dem JavaDocs und Ausgabe-Ticket: Es ist wichtig, nicht shutdownNow() zu nennen (die Fäden unterbrechen), wenn der Standardkanal-basierten FSDirectory Implementierungen verwendet werden. Die Verwendung des (langsameren) RAFDirectory scheint kein Problem mit den resultierenden unterbrochenen Threads zu haben.

+0

Dank viel! Also, wenn ich die java docs verstehe und Tickets korrekt ausstelle, ist es wichtig, 'shutdownNow()' nicht aufzurufen, wenn die standardmäßigen Channel-basierten 'FSDirectory' Implementierungen verwendet werden. Die Verwendung des (langsameren) 'RAFDirectory' scheint bei unterbrochenen Threads kein Problem zu haben. –

+0

Das ist auch mein Verständnis. –

+0

Die Notiz benötigt nur 'NIOFSDirectory', nicht' FSDirectory'. –

1

1. Der einfachste Weg wäre ein CollectorDelegate, der einen vorhandenen Collector umschließt und einen booleschen Wert überprüft, bevor er die Methoden der Delegierten sammelt.

Bitte schauen Sie in this link dies könnte Ihnen helfen.

2. Sie könnten Ihren eigenen HitCollector erstellen, der bei jedem Treffer eine Markierung überprüft, und eine Ausnahme auslösen, wenn sie gesetzt wurde. In einem separaten Thread können Sie die Markierung setzen, um die Suche abzubrechen.

Diskutiert über die same issue

Verwandte Themen