Lucene.Net синхронизация записи / чтения - PullRequest
10 голосов
/ 24 марта 2011
  1. Могу ли я записать (с IndexWriter) новые документы в индекс, пока он открыт для чтения (с IndexReader)?Или я должен закрыть чтение перед записью?

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

  3. Безопасно ли работает Lucene.Net или нет?Или я должен написать свой собственный?

Ответы [ 2 ]

20 голосов
/ 30 марта 2011

В любой момент может быть открыто любое количество читателей / поисковиков, но только один писатель.Это обеспечивается блокировкой, специфичной для каталога, обычно включающей файл с именем «write.lock».

Считыватели открывают моментальные снимки, а писатели добавляют дополнительные данные в индекс.Считыватели должны быть открыты или повторно открыты (IndexReader.Reopen) после того, как ваш писатель зафиксировал (IndexWriter.Commit) данные, чтобы их можно было увидеть, если вы не работаете с поисками почти в реальном времени.Для этого требуется специальный читатель, возвращаемый из (IndexWriter.GetReader), который сможет видеть содержимое до того момента, как был выполнен вызов GetReader.Это также означает, что читатель может видеть данные, которые никогда не будут переданы из-за логики приложения, вызывающей IndexWriter.Rollback.

. Поисковые системы используют считыватели, поэтому для них одинаковые ограничения.(Неограниченное количество из них может видеть только то, что уже передано, если только оно не основано на читателе, работающем почти в реальном времени.)

Lucene является поточно-ориентированным, и передовой практикой является разделение читателей и поисковиков между несколькими потоками при проверкечто IndexReader.IsCurrent() == true.Вы можете запустить фоновый поток, который снова открывает считыватель, как только он обнаруживает изменения, создает новый поисковик и затем позволяет основным потокам использовать его.Это также позволит вам подогревать любой FieldCache, который вы используете, чтобы увеличить скорость поиска, когда новый поисковик будет установлен.

0 голосов
/ 25 марта 2011

Как я обнаружил в этом списке рассылки

Lucene.NET является поточно-ориентированным.Таким образом, вы можете использовать один и тот же экземпляр IndexWriter или IndexSearcher среди потоков.Использование блокировки записи также препятствует открытию второго экземпляра IndexWriter с тем же индексом.

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

...