Lucene.NET - >拒绝访问段

时间:2008-11-07 09:56:55

标签: asp.net lucene.net access-denied segments

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

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

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

非常感谢任何想法。

5 个答案:

答案 0 :(得分:1)

我怀疑您的IndexModifier与搜索者争用。

以下是我在bug tracking应用BugTracker.NET中使用Lucene.Net的方式,这似乎正常。

我在app启动时创建索引。

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

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

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

答案 1 :(得分:1)

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

// ----------------- 问题 -------------------- -----------------

for(int y = 0; y <6000; y ++) {      文档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

答案 2 :(得分: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上,你有时会看到断断续续的 重命名段中的“访问被拒绝”错误。新到段或 deletable.new to deletable等.Lucene通常首先写文件 到X.new然后重命名为X.“

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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