Синхронизация записи/чтения Lucene.Net

  • Можно ли записать (с IndexWriter) новые документы в индекс, пока он открыт для чтения (с помощью IndexReader)? Или я должен закрыть чтение перед тем, как писать?

  • Могу ли я читать/искать документы (с IndexReader) в индексе, пока он открыт для записи (с IndexWriter)? Или я должен закрыть письмо перед чтением?

  • Является ли 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 должен быть открыт с тем же индексом.

Как я вижу, я могу писать и читать отдельно; Я проверю это;)