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