3

我对 Lucene.NET 有疑问。在索引期间,我收到错误“拒绝访问路径段”。或者有时“拒绝访问可删除的路径”。我最终给了“所有人”对索引目录的完全安全权限,但问题仍然存在。

然后我发现在索引运行期间,lucene将segments文件重命名为'segments.new',然后发生了这个错误。我猜有些进程在重命名后仍然试图从旧的段文件中读取?我不知道为什么会发生这种情况,或者如何解决这个问题。奇怪的是,我的合作开发者可以毫无问题地在他们的计算机上运行索引。

错误发生在 Lucene.Net.Index.IndexModifier.AddDocument(Document) 中。

任何想法将不胜感激。

4

5 回答 5

1

我支持 Imma 的解决方案。我也有这个问题。对我来说,解决方法是将 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 上,您有时会在将segments.new 重命名为segments 或将deletable.new 重命名为可删除等时看到间歇性的“拒绝访问”错误。Lucene 通常先将文件写入X.new,然后重命名为X。”

于 2009-12-11T04:22:20.980 回答
1

我想我找到了一个解决方案..至少它对我有用..我正在测试“segments.new”问题,下面你有代码..所以你可以在循环中看到我创建了数千个 lucene 文档(6000).. 在大约 1360 文档出现一个错误,说他无法重命名 blablabla.. 代码是用 c# 编写的.. 基本上你只需要为错误插入一个 try catch(在循环内),当弹出错误,您只需再次尝试将 int 循环数 (y) 减一 (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++) { 尝试 {

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

我不是英国人,如果某个词有任何错误,我很抱歉……现在考虑到 immanouel

于 2009-08-25T01:55:40.803 回答
1

此问题是由锁定段(.new)文件的在线病毒扫描程序引起的。我不得不编写一个自定义的 Lucene Directory 实现来解决这个问题。

于 2008-11-20T11:04:32.600 回答
1

我怀疑您的 IndexModifier 与 Searcher 争用。

这是我在错误跟踪应用程序BugTracker.NET中使用 Lucene.Net 的方法,它似乎工作正常。

我在应用程序启动时创建索引。

我创建了一个搜索器并保留它,这样每次搜索都不会重新加载索引。所有线程共享同一个搜索器。当搜索器搜索时,它会抓取一个锁,搜索,然后释放锁,以便另一个线程可以搜索。在我的应用程序中强制搜索到单个文件是可行的,因为 Lucene.NET 速度很快,并且错误跟踪系统并不那么忙。

同时,我有一个 IndexWriter 可以在数据发生更改时更新索引。它只是发生了一点变化,因此它也可以快速完成任务。当它需要运行时,它会获取相同的锁,销毁搜索器,更新索引,然后重新创建搜索器。新的搜索器会一直存在,直到索引的下一次更新。搜索者总是使用最新的索引。

您可以获取 BugTracker.NET 源代码并查看文件 my_lucene.cs 和 search_text.aspx。这一切都在这两个文件中,并且没有那么多代码。

于 2008-11-07T10:14:41.883 回答
0

我读到了这个。但是,我没有运行任何病毒扫描程序。我还为索引目录禁用了 Vista 搜索索引,从任务管理器中终止了搜索索引进程,以确保没有其他进程锁定文件。不幸的是,无济于事。此外,问题似乎更多的是它试图访问的“段”文件已经消失(因为 lucene 将其重命名为segments.new)。我不确定它们是否是相同的问题...

于 2008-11-24T08:15:53.080 回答