Lucene возле поиска в реальном времени
Я хотел бы повысить скорость своей поисковой системы, используя некоторые функции, такие как "Поиск в реальном времени", что ускоряет открытие индекса.
Кто может сказать мне, в чем различия и преимущества использования одного или другого из следующих фрагментов кода:
IndexReader newIndexReader = IndexReader.openIfChanged(oldReader);
а также
IndexWriter writer; // create an IndexWriter here
...
IndexReader reader = writer.getReader();
Обратите внимание, что в первом случае мне не нужно, чтобы indexWriter находился в том же процессе, что и IndexReader.
1 ответ
Прежде всего, writer.getReader()
доступно только в версии 3.6, но отсутствует во всех версиях v4 (4.0, 4.1, ...). Таким образом, вы не должны использовать его, если вы заботитесь о ремонтопригодности.
Теперь, чтобы ответить на ваш вопрос. writer.getReader()
сбрасывает все ожидающие записи и безоговорочно открывает нового читателя (плюс есть некоторые другие ограничения - см. метод javadoc). IndexReader.openIfChanged(oldReader)
открывает только новый читатель, если были внесены какие-либо изменения, в противном случае возвращает старый читатель.
На мой вкус, открытие читателя от писателя также является концептуально неправильным (в Lucene были и другие случаи такой проблемы, например, когда раньше можно было удалять документы с помощью читателя).
Если вы выбираете между двумя, я думаю, нет сомнений в том, какой метод использовать.