2015-03-03 4 views
0

У меня есть Azure WebJob с очередью, которая получает элементы для обработки. Каждый этап может обрабатывать много элементов. Очередь обрабатывает около 20 элементов одновременно.lucene.net - как часто обновлять индекс?

Я хочу индексировать элементы с помощью Lucene .net.

Запуск IndexWriter, вызов Optimize() и удаление его на каждый элемент, попадающий в очередь, занимает слишком много времени. Мне кажется, что я делаю это неправильно.

Я хочу, чтобы товары были готовы к поиску как можно скорее.

Можно ли иметь один индекс для многих потоков?

Нужно ли мне звонить Оптимизировать(), или это нормально никогда не вызывать его или вызывать его на отдельный процесс, который работает один раз в день (например)?

Если у меня есть только один IndexWriter и никогда не удаляйте его (кроме случаев, когда программа выходит), у меня были бы новые элементы, застрявшие в буфере?

Могут ли новые предметы, добавленные в IndexWriter, быть доступны для поиска, прежде чем удалять IndexWriter?

спасибо.

ответ

3
  1. IndexWriter является потокобезопасным, его можно безопасно звонить из разных потоков.
  2. Это нормально, когда вы никогда не вызываете оптимизацию. (Вы можете написать настраиваемую политику слияния, если по умолчанию не работает для вас.)
  3. Вы очистите все документы на диск, вызвав commit. Вам не нужно распоряжаться своим писателем. Повторно используйте его.
  4. Документы доступны для поиска, как только читатель увидит их. Это происходит после того, как вы зафиксируете своего автора и снова откроете читателя. Вы можете прочитать их, прежде чем они будут совершены, используя поиск в режиме реального времени (NRT), захватив читателя с IndexWriter.OpenReader.