Lucene.NET -> доступ запрещен для сегментов

У меня проблема с Lucene.NET. Во время индекса я получаю сообщение об ошибке "Доступ к сегментам пути запрещен". Или иногда "Доступ к удаляемому пути запрещен". В конце концов я предоставил "Все" полные права безопасности для каталога индекса, но проблема все еще существовала.

Затем я обнаружил, что во время выполнения индекса lucene переименовывает файл сегментов в "plot.new", и затем возникает эта ошибка. Я думаю, что какой-то процесс все еще пытается прочитать из старого файла сегментов после того, как он был переименован? Я понятия не имею, почему это происходит или как это исправить. Как ни странно, мои соавторы могут без проблем запускать индекс на своем компьютере.

Ошибка происходит в случается в Lucene.Net.Index.IndexModifier.AddDocument(Document).

Любые идеи будут высоко ценится.

5 ответов

Я подозреваю, что ваш IndexModifier находится в конфликте с поисковиком.

Вот как я использую Lucene.Net в своем приложении для отслеживания ошибок BugTracker.NET, которое, кажется, работает нормально.

Я создаю индекс при запуске приложения.

Я создаю поисковик и сохраняю его так, чтобы индекс не перезагружался при каждом поиске. Все темы используют один и тот же поисковик. Когда поисковик выполняет поиск, он захватывает блокировку, выполняет поиск, а затем снимает блокировку, чтобы другой поток мог выполнять поиск. В моем приложении можно выполнить поиск в одном файле, потому что Lucene.NET работает быстро, а система отслеживания ошибок НЕ НАСТОЯЩАЯ.

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

Вы можете получить исходный код BugTracker.NET и посмотреть файлы my_lucene.cs и search_text.aspx. Это все в этих двух файлах, и там не так много кода.

Я думаю, что я нашел решение... по крайней мере, это сработало для меня... Я тестировал проблему "columns.new", и ниже у вас есть код... так что, как вы можете видеть в цикле, я создал тысячи документов lucene (6000). Приблизительно в 1360 году появляется сообщение о том, что он не может переименовать blablabla. Код написан на C#.. В основном вам просто нужно вставить try try (внутри цикла) для ошибки и когда появляется ошибка, попробуйте еще раз вычесть nunmber (y) цикла int на единицу (y = y - 1)..

// -----------------Проблема ------------------------------ -------

for (int y = 0; y<6000; y ++) {Document doc = new Document ();

 doc.Add(new Field("URL", "C:/Users/blabla/(convert-csharp)/IMssg", Field.Store.YES, Field.Index.TOKENIZED));

 writer.AddDocument(doc);

}

// --------------------Решение--------------------------- -------------

IndexWriter writer = new IndexWriter ("C: / Users / blabla / (convert-csharp) / IMssg", new StandardAnalyzer (), false);

for (int y = 0; y<6000; y ++) {try {

 Document doc = new Document();

 doc.Add(new Field("URL", "C:/Users/blabla/(convert-csharp)/IMssg", Field.Store.YES, Field.Index.TOKENIZED));

 writer.AddDocument(doc);

  }
   catch (Exception t) 
  {

   y = (y < 0) ? 0 : y - 1;

   string gfff = t.Message.ToString();

   }

}

writer.Close ();

Я не англичанин, так что мне очень жаль, если в каком-то слове есть ошибка...

Я второе решение Иммы. У меня тоже была эта проблема. Исправление для меня заключалось в том, чтобы поместить try/catch в IndexWriter.AddDocument(doc):

 int attemptNo = 0;
 while (attemptNo < 2)
 {
    try
    {
       writer.AddDocument(doc);
       break;
    }
    catch (Exception e)
    {
       String ErrMsg = String.Format("{0} ({1}): While adding Document {2}/{3}, caught {4}", DateTime.Now, attemptNo, doc.GetField("kanji").StringValue(), doc.GetField("kana").StringValue(), e.Message);
       attemptNo++;
       System.Threading.Thread.Sleep(30);
       Application.Current.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Normal, (Action)delegate()
       {
          ViewModel.Log.Add(ErrMsg);
       });
    }

ссылка: http://issues.apache.org/jira/browse/LUCENE-665:

"Суть проблемы в том, что в Windows вы иногда видите перемежающиеся ошибки" Отказано в доступе "при переименовании сегментов. От новы до сегментов или от удаления. Новых до удаляемых и т. Д. Обычно Lucene записывает файлы сначала в X.new, а затем переименовывает, затем в ИКС."

Эта проблема вызвана тем, что антивирусный сканер блокирует файл сегментов (.new). Мне пришлось написать собственную реализацию Lucene Directory, чтобы обойти это.

Я читал об этом. Однако у меня не работает ни один антивирусный сканер. Я также отключил Vista Search Index для каталога индекса, убил процесс поиска индекса из диспетчера задач, чтобы убедиться, что никакой другой процесс не блокирует файл. К сожалению, безрезультатно. Более того, проблема, скорее всего, заключается в том, что файл "сегментов", к которому он пытается получить доступ, исчез (поскольку lucene переименовал его в сегменты. New). Я не уверен, что у них одинаковые проблемы...

Другие вопросы по тегам