Lucene: открыть индексатор после индекса - PullRequest
6 голосов
/ 27 марта 2012

когда мой поисковый сервер начнет работать, он загрузит весь индекс сразу для всех запросов. Тем не менее, он все еще использует старый индекс, даже если я перестроил индекс. Так что я думаю, что я должен сказать indexReader поисковика, чтобы открыть индекс после того, как сервер перестроил индекс, но как это реализовать? Может быть, использовать шаблон производитель-потребитель? Хотя я могу использовать indexReader.isCurrent (), чтобы проверить, изменился ли индекс, но я должен проверять это всегда для поиска или в какой-то период. Есть ли более эффективный и в режиме реального времени способ?

Ответы [ 2 ]

6 голосов
/ 27 марта 2012

Удобный способ сделать то, что вы описываете, - это использовать вспомогательный класс Lucene SearcherManager . Если вы заинтересованы в поиске почти в реальном времени, вас также может заинтересовать NRTManager .

В блоге Mike McCandless .

есть отличная статья в блоге об этих двух классах.
0 голосов
/ 29 марта 2012

Это далеко не простая задача. Мне пришлось написать довольно много кода для его достижения (к сожалению, он написан на Clojure, поэтому примеров Java-кода под рукой нет). Основной принцип - иметь поточно-ориентированную ссылку на ваш IndexSearcher, которая доступна как для кода чтения индекса, так и для кода построения индекса. Построитель индекса начинает создавать новый индекс в фоновом режиме; это не мешает существующим индексам. По завершении он входит в синхронизированный блок, закрывает IndexReader и IndexSearcher, открывает новый IndexReader и обновляет глобальную ссылку IndexSearcher на созданный из него IndexSearcher. Весь читающий код должен синхронизироваться с той же блокировкой, что и упомянутый синхронизированный блок. Лучшая альтернатива - использовать ReentrantReadWriteLock вместо синхронизированного блока. Это позволит избежать ненужных конфликтов между многими потоками читателей.

После инициализации, во время нормальной работы, вы можете использовать NRTManager для одновременного чтения индекса и внесения в него инкрементных обновлений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...