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

Другие вопросы по тегам