2017-12-27 3 views
0

Ich habe einige grundlegende Fragen zur Verwendung von SearcherManager mit IndexWriter.Verwenden von IndexWriter mit SearchManager

Ich muss den Lucene-Index in der Anwendung regelmäßig neu erstellen und derzeit passiert es auf einem anderen Thread als der, der die Suchanfragen dient.

  1. Kann ich dieselbe IndexWriter-Instanz während der Lebensdauer der Anwendung verwenden, um den Index regelmäßig neu zu erstellen? Momentan erstelle/öffne ich ihn einmal während des Hochfahrens und rufe einfach IndexWriter#commit auf, wenn ein neuer Index erstellt wird.
  2. Ich verwende SearcherManager zu erwerben und IndexSearcher Instanzen für jede Suchanfrage freigeben. Nachdem der Index periodisch erstellt wurde, plane ich, SearcherManager#maybeRefresh Methode zu verwenden, um IndexSearcher instances.SearcherManager-Instanz zu erhalten, wird auch einmal während des Starts erstellt, und ich beabsichtige, es durch zu behalten.
  3. Ich schließe nicht die IndexWriter oder SearcherManager während der gesamten Lebensdauer der App.

Nun zu den Fragen,

  1. Wenn ich einen neuen Indexwriter jedes Mal, wenn ich den Index neu erstellen muß erstellen, wird SearcherManager#maybeRefresh die Lage sein, zu erkennen, dass es eine neue Instanz Indexwriter ist? Oder muss ich einen neuen SearcherManager mit dem neu erstellten IndexWriter erstellen?
  2. Was ist der Unterschied zwischen dem Erstellen einer SearcherManager Instanz mit einem IndexWriter, Erstellen mit einem DirectoryReader oder Erstellen mit einem Directory?

Antwort

1

Die Antworten davon abhängen, wie Sie bauen Ihre SearcherManager:

Wenn Sie es mit einem DirectoryReader konstruieren, alle zukünftigen IndexSearchers vom SearcherManager erworben werden an diesem Leser basieren, dh alle Suchvorgänge werden Ergebnisse ab dem Zeitpunkt bereitstellen, zu dem Sie den SearcherManager instanziiert haben. Wenn Sie Daten in das Verzeichnis/index schreiben und danach SearcherManager.maybeRefresh() ausführen, wird der Reader nicht aktualisiert und Ihre Suchergebnisse werden veraltet sein.

Wenn Sie die SearcherManager mit einem Indexwriter konstruieren, SearcherManager.maybeRefresh() wird der SearcherManager des Leser aktualisieren, wenn Daten geschrieben worden ist und von dem Schriftsteller verpflichtet. Alle neu erworbenen IndexSeachers spiegeln dann den neuen Zustand des zugrunde liegenden Index wider.

Trotz begrenzter Erfahrung empfehle ich, den letzteren Ansatz zu verwenden. Es bietet eine sehr einfache Möglichkeit near-real-time searching zu implementieren: Beim Programmstart erstellen Sie einen IndexWriter und konstruieren damit einen SearcherManager. Danach starten Sie einen Hintergrund-Thread, der periodisch alle Änderungen im IndexWriter festschreibt und den SearcherManager aktualisiert. Während der gesamten Lebensdauer Ihrer Anwendung können Sie den ursprünglichen IndexWriter und SearcherManager weiterhin verwenden, ohne sie zu schließen oder erneut zu öffnen.


PS: Ich habe begonnen, nur mit Lucene Arbeit vor ein paar Tagen, so nehmen Sie nicht alles, was ich hier als 100% sicher schrieb.