Lucene.NET -> доступ запрещен для сегментов - PullRequest
2 голосов
/ 07 ноября 2008

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

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

Ошибка возникает в Lucene.Net.Index.IndexModifier.AddDocument (Document).

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

Ответы [ 5 ]

1 голос
/ 11 декабря 2009

Я второе решение Иммы. У меня была эта проблема также. Исправление для меня заключалось в том, чтобы поставить 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 вы иногда видите прерывистый Ошибки «Отказано в доступе» при переименовании сегментов. Новые для сегментов или deletetable.new to deletetable и т. д. Lucene обычно сначала записывает файлы в X.new, а затем переименовывается в X. "

1 голос
/ 25 августа 2009

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

// ----------------- Задача --------------------- ----------------

для (int y = 0; y <6000; y ++) { Документ doc = новый документ (); </p>

 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);

для (int y = 0; y <6000; y ++) { пытаться {</p>

 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();

   }

} * * тысяча двадцать-один * * 1 022 writer.Close ();

Я не англичанин, поэтому мне жаль, если в каком-то слове есть какая-то ошибка ... к настоящему времени С наилучшими пожеланиями

1 голос
/ 07 ноября 2008

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

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

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

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

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

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

0 голосов
/ 24 ноября 2008

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

0 голосов
/ 20 ноября 2008

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

...