2008-10-11 6 views
15

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

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

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

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

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

+0

Не могли бы вы объяснить, как вы реализовали блокировки? Используете ли вы блокировки чтения и записи или только одну общую блокировку? – 2010-02-15 11:24:18

+0

Один общий замок. Я написал, что я сделал: http://ifdefined.com/blog/post/Full-Text-Search-in-ASPNET-using-LuceneNET.aspx – 2010-02-15 14:08:43

+0

То, что вы говорите в своем вопросе, неверно: «Итак, вы можете не оставляйте поиск открытым и ожидайте, что писатель в другом потоке сможет обновить индекс. И если поток занят обновлением индекса, тогда попытка создания поисковика завершится неудачей ». Как упоминалось в других ответах: «Редактор индекса или читатель могут редактировать файлы индекса lucene во время поиска» и наоборот. – 2013-10-20 01:10:21

ответ

2

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

21

Согласно this page,

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

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

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

3

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

 Смежные вопросы

  • Нет связанных вопросов^_^