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