Lucene: повторно открыть индексный индекс после индекса

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

2 ответа

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

В блоге Майк МакКандлесс есть очень хорошая статья в блоге об этих двух классах.


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

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

licensed under cc by-sa 3.0 with attribution.