Подтвердить что ты не робот

Избегайте удаления текущего индекса Lucene.NET при восстановлении

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

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

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

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

4b9b3361

Ответ 1

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

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

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

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

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

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

Ответ 2

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

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