Избегайте удаления текущего индекса Lucene.NET во время перестройки - PullRequest
12 голосов
/ 07 января 2011

Я новичок в Lucene.NET, но я использую инструмент с открытым исходным кодом , созданный для Sitecore CMS , который использует Lucene.NET для индексации большого количества контента из CMS.Вчера я подтвердил, что когда я перестраиваю свои индексы, текущие файлы индексов стираются, поэтому все, что зависит от индекса, не получает данных в течение 30-60 секунд (количество времени для полного перестроения индекса).Есть ли лучший способ или способ заставить Lucene.NET не перезаписывать текущие индексные файлы, пока новый индекс не будет полностью перестроен?Я в основном думаю, что хотел бы, чтобы он записывал в новые файлы временных индексов, и когда перестройка будет завершена, эти файлы перезаписывают текущий индекс.

Пример того, о чем я говорю:

  • Создание нового индекса (~ 30 секунд)
  • Индекс содержит около 500 документов
  • Использование кода для доступа к данным в индексе и отображения на веб-сайте
  • Восстановление индекса (~ 30 секунд)
    • Любой код, который теперь читает индекс для данных, ничего не возвращает, потому что файлы индекса перезаписываются;результаты на веб-сайте не отображаются никакие данные
  • Восстановление завершено: данные снова доступны, данные возвращены на веб-сайт

Заранее спасибо

Ответы [ 2 ]

6 голосов
/ 07 января 2011

У меня нет опыта работы с самим "Sitecore", но вот моя история.

Мы недавно включили поиск по индексу (используя Lucene.Net) для нашей подсистемы электронной коммерции. Процесс обновления индекса в нашем случае может занять около получаса (~ 50 000 продуктов + много связанной информации). Чтобы предотвратить ответы типа «отказ в обслуживании» во время обновления индекса, мы сначала создаем его «резервную» версию (просто копируя каталог индекса в другое место), и все дальнейшие запросы перенаправляются для использования этой «резервной» версии. Когда обновление индекса завершено, мы удаляем резервную копию, чтобы клиенты начали использовать обновленную (или «живую») версию индекса. Это также помогает в случае любых необработанных исключений, которые могут возникнуть во время процесса обновления, потому что вы можете оказаться в ситуации, когда у вас вообще нет индекса (а в нашем случае клиенты всегда могут использовать «резервную» версию).

Ссылка API (Lucene 2.4) объекта Lucene.Net.Index.IndexWriter сообщает следующее:

Обратите внимание, что вы можете открыть индекс с помощью create=true даже когда читатели используя индекс. Старые читатели продолжить поиск «момент времени» снимок они открыли, и не будут увидеть вновь созданный индекс, пока они повторно открыть.

Так что, по крайней мере, вам не нужно беспокоиться о клиентах, которые в данный момент ищут в вашем индексе.

Надеюсь, это поможет вам принять правильное решение.

1 голос
/ 07 января 2011

Я не знаком с этим инструментом sitecore, но я могу ответить, как бы вы сделали это с чистым Lucene.Net: вы должны использовать установку NRT , что означает «иметь одного средства записи индекса и никогда закрой его. "

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

...