Lucene возле поиска в реальном времени
Я использую Lucene 6.6.0, и я хотел бы использовать функцию поиска практически в реальном времени Lucene. Однако мне не удалось это реализовать. Я пытаюсь получить эту функцию следующим образом:
Я инициализирую экземпляр IndexReader:
this.reader = DirectoryReader.open(this.directory);
Давайте предположим, что в индекс были внесены некоторые изменения с помощью экземпляра IndexWriter. Затем, если я правильно понимаю, мне нужен второй экземпляр IndexReader для фиксации обновлений:
this.newReader = DirectoryReader.openIfChanged(this.reader);
if (this.newReader != null) {
// Update the IndexSearcher with the new IndexReader instance
this.searcher = new IndexSearcher(this.newReader);
this.reader.close();
}
Проблема здесь в том, что код не компилируется из-за следующей ошибки: The method openIfChanged(DirectoryReader) in the type DirectoryReader is not applicable for the arguments (IndexReader)
,
Как мне обновить IndexReader
затем?
Во-вторых, если я обновлю индекс еще раз, мне понадобится еще один экземпляр IndexReader, не так ли? Будет ли самый оптимальный способ свободно обновлять индекс во время выполнения программы, переключаясь между двумя экземплярами IndexReader после каждого обновления?
Спасибо.
1 ответ
Попробуйте использовать SearcherManager вместо IndexReader: http://lucene.apache.org/core/6_6_0/core/org/apache/lucene/search/SearcherManager.html
На основе SearcherManager вы можете выполнять следующие методы:
// get a IndexSearcher for searching
IndexSearcher searcher = searcherManager.aquire();
// release IndexSearcher after search
searcherManager.release(searcher);
// refresh and add new index records to next search. usually after a commit
searcherManager.maybeRefresh();
Я попытался реализовать это, и в основном я сделал это:
- создайте IndexWriter и оставьте его открытым
- создайте SearcherManager с IndexWriter в качестве параметра.
- используйте SearcherManager для поиска
- используйте IndexWriter для операций индексирования.
- совершать после индексации
Кроме того, вы можете использовать отдельный поток для периодической фиксации, а не для каждой записи, потому что операция фиксации может быть довольно "дорогой".
Пример здесь: http://www.lucenetutorial.com/lucene-nrt-hello-world.html