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

Lucene.Net управляет несколькими потоками, обращаясь к одному и тому же индексу, один индексируя, а другой ищет?

При использовании Lucene.Net с ASP.NET я могу представить, что один веб-запрос может инициировать обновление индекса, а другой веб-запрос выполняет поиск. Может ли Lucene.Net встроить в нее возможность управлять параллельным доступом или мне нужно управлять им, чтобы избежать ошибок "из-за другого процесса"?

EDIT: после чтения документов и экспериментов, это то, что, как я думаю, я узнал: есть две проблемы: безопасность потоков и concurrency. Многопоточность "безопасна" в том, что вы не можете сделать ничего плохого для индекса. Но он безопасен ценой только одного объекта, имеющего блокировку индекса за один раз. Второй объект придет и выдаст исключение. Таким образом, вы не можете оставить поиск открытым и ожидать, что писатель в другом потоке сможет обновить индекс. И если поток занят обновлением индекса, тогда попытка создания поисковика завершится с ошибкой.

Кроме того, Searchers видят индекс, как это было в то время, когда они его открывают, поэтому, если вы их сохраните и обновите индекс, они не будут видеть обновления.

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

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

4b9b3361

Ответ 1

Согласно эта страница,

Индексирование и поиск не только безопасный поток, но безопасный процесс. Какие это означает, что:

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

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

Ответ 2

У вас могут возникнуть проблемы, если поток индексирования создает новый документ, который приводит к слиянию некоторых сегментов индекса, тогда объединенные сегменты будут удалены, и будет создан новый сегмент. Проблема в том, что ваш поисковик индекса загружал все сегменты при его открытии, например, имеет указатели на те сегменты, которые существовали при его открытии. Теперь, если создатель индекса делает сегмент слиянием и удаляет сегмент, ваш поисковик индекса по-прежнему будет считать, что файл сегмента существует и завершится с ошибкой "файл не найден". То, что вам действительно нужно сделать, это отделить ваш записываемый индекс от вашего индекса, доступного для поиска, с помощью SOLR или выполнить собственную репликацию моментального снимка индекса, аналогичную тому, что делает SOLR. У меня есть очень похожая система для SOLR с использованием .NET и Lucene.NET в Windows, с использованием жестких ссылок NTFS для эффективной репликации моментальных снимков. Я могу дать вам больше информации, если вы заинтересованы.

Ответ 3

У вас нет проблемы с этим, так как управление одновременной записью в индекс. У меня был более простой путь с SOLR, который абстрагирует большинство этих различий для меня, поскольку он работает как сервер.