Управляет ли Lucene.Net несколькими потоками, обращающимися к одному и тому же индексу, один индексирует, а другой выполняет поиск? - PullRequest
15 голосов
/ 11 октября 2008

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

РЕДАКТИРОВАТЬ: После прочтения документов и экспериментов, я думаю, что вот что я узнал: есть две проблемы: безопасность потоков и параллелизм. Многопоточность «безопасна» в том смысле, что с индексом ничего плохого сделать нельзя. Но это безопасно за счет того, что только один объект имеет блокировку индекса одновременно. Второй объект придет и выдаст исключение. Таким образом, вы не можете оставить поиск открытым и ожидать, что писатель в другом потоке сможет обновить индекс. И если поток занят обновлением индекса, попытка создать поисковик не удастся.

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

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

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

Ответы [ 3 ]

22 голосов
/ 12 октября 2008

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

Индексация и поиск не только Поток безопасно, но безопасно. Какие это означает, что:

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

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

3 голосов
/ 29 октября 2008

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

2 голосов
/ 11 октября 2008

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

...