Ответ 1
В любое время вы можете открыть любое количество читателей/поисковиков, но только один писатель. Это принудительно блокируется каталогом, обычно с файлом с именем "write.lock".
Читатели открывают снимки, а авторы добавляют в индекс больше данных. Читатели должны быть открыты или повторно открыты (IndexReader.Reopen
) после того, как ваш писатель совершил (IndexWriter.Commit
) данные для его просмотра, если только вы не работаете с поиском почти в режиме реального времени. Это включает в себя специальный читатель, возвращаемый с (IndexWriter.GetReader
), который сможет видеть контент до момента выполнения вызова GetReader. Это также означает, что читатель может видеть данные, которые никогда не будут совершены из-за логики приложения, вызывающей IndexWriter.Rollback
.
Искатели используют читателей, поэтому одинаковые ограничения на них. (Неограниченное число из них, может видеть только то, что уже совершено, если только на основе читателя почти реального времени.)
Lucene является потокобезопасной, и лучше всего делиться читателями и поисковиками между несколькими потоками, проверяя, что IndexReader.IsCurrent() == true
. Вы могли бы запустить фоновый поток, который заново откроет читатель, как только он обнаружит изменения, создаст нового поисковика, а затем включит основные потоки. Это также позволит вам предварительно использовать любой FieldCache, который вы используете для увеличения скорости поиска, когда новый поисковик будет на месте.