Sitecore Lucene索引 - 使用高级数据库爬网程序找不到文件异常

时间:2013-08-15 13:19:37

标签: lucene sitecore filenotfoundexception

我在内容管理环境中遇到Sitecore / Lucene问题,我们有两个内容交付环境,这不是问题。我正在使用高级数据库爬虫来索引许多已定义模板的项目。索引指向master数据库。

索引将保持“稳定”几个小时左右,然后在日志中我将开始看到此错误出现。如果我试着打开一个搜索者。

ManagedPoolThread #17 16:18:47 ERROR Could not update index entry. Action: 'Saved', Item: '{9D5C2EAC-AAA0-43E1-9F8D-885B16451D1A}'
Exception: System.IO.FileNotFoundException
Message: Could not find file 'C:\website\www\data\indexes\__customSearch\_f7.cfs'.
Source: Lucene.Net
   at Lucene.Net.Index.SegmentInfos.FindSegmentsFile.Run()
   at Sitecore.Search.Index.CreateReader()
   at Sitecore.Search.Index.CreateSearcher(Boolean close)
   at Sitecore.Search.IndexSearchContext.Initialize(ILuceneIndex index, Boolean close)
   at Sitecore.Search.IndexDeleteContext..ctor(ILuceneIndex index)
   at Sitecore.Search.Crawlers.DatabaseCrawler.DeleteItem(Item item)
   at Sitecore.Search.Crawlers.DatabaseCrawler.UpdateItem(Item item)
   at System.EventHandler.Invoke(Object sender, EventArgs e)
   at Sitecore.Data.Managers.IndexingProvider.UpdateItem(HistoryEntry entry, Database database)
   at Sitecore.Data.Managers.IndexingProvider.UpdateIndex(HistoryEntry entry, Database database)

从我读到的内容可能是由于索引更新而有一个打开的阅读器,并且当合并操作发生时,阅读器仍然会有对已删除段的引用,或者是有用的东西(I'我不是Lucene的专家。)

我尝试了一些没有成功的事情。包括对Sitecore.Search.Index对象进行子类化并覆盖CreateWriter(bool recreate)以更改合并调度程序/策略并调整合并因子。见下文。

protected override IndexWriter CreateWriter(bool recreate)
{
      IndexWriter writer = base.CreateWriter(recreate);
      LogByteSizeMergePolicy policy = new LogByteSizeMergePolicy();
      policy.SetMergeFactor(20);
      policy.SetMaxMergeMB(10);
      writer.SetMergePolicy(policy);
      writer.SetMergeScheduler(new SerialMergeScheduler());
      return writer;
}

当我正在阅读索引时,我调用了SearchManager.GetIndex(Index).CreateSearchContext()。搜索器,当我完成了我需要的文件时,我调用.Close(),我认为这已经足够了。

我想我也许可以尝试重写CreateSearcher(bool close),以确保我每次都打开一个新的读者,我会在此之后再试一次。关于Sitecore如何处理其读者/作者Lucene,我真的不太了解?

我也试过在Web配置中使用UpdateInterval值来查看是否会有所帮助,唉它没有。

我将非常感谢a)知道任何可能发生这种情况的情况,以及b)任何潜在的建议/解决方案,因为我开始对着相当大的墙壁开口:)

我们正在使用Lucene 2.3运行Sitecore 6.5 rev111123。

谢谢,

詹姆斯。

1 个答案:

答案 0 :(得分:3)

当你试图重新索引正在被索引的过程中的东西时,Lucene似乎吓坏了。要验证这一点,请尝试以下操作:

  • 将索引的updateinterval设置为非常高的值(8小时)。

  • 然后,停止w3wp.exe并删除索引。

  • 删除索引后尝试在Sitecore中重建索引并等待此操作完成。
  • 再次测试并查看是否发生这种情况。

如果不再发生这种情况,那么updateinterval设置得太低会导致您的索引(可能仍在构建中)被新的覆盖(也不会完成)导致您的segments.gen文件包含错误的索引信息。

.gen文件会将您的indexreader指向索引中的哪些细分,并在索引重建后重新创建。

这就是为什么我建议尝试在很长时间内禁用更新并手动重建它。