Sitecore Lucene索引-使用高级数据库爬虫未找到文件异常

Sitecore Lucene索引-使用高级数据库爬虫未找到文件异常,lucene,sitecore,filenotfoundexception,Lucene,Sitecore,Filenotfoundexception,我在我们的内容管理环境中遇到了Sitecore/Lucene问题,我们有两个内容交付环境,这不是问题。我正在使用高级数据库爬虫来索引一些已定义模板的项。索引指向主数据库 索引将保持“稳定”几个小时左右,然后在日志中我将开始看到这个错误出现。如果我尝试打开一个搜索引擎 ManagedPoolThread #17 16:18:47 ERROR Could not update index entry. Action: 'Saved', Item: '{9D5C2EAC-AAA0-43E1-9F8D-

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

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

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)
据我所知,这可能是由于在有一个打开的读卡器的情况下对索引进行了更新,并且当发生合并操作时,读卡器仍然会引用已删除的段,或者其他有用的内容(我不是Lucene方面的专家)

我试过几件事都没有成功。包括对Sitecore.Search.Index对象进行子分类,覆盖CreateWriter(boolRecreate)以更改合并计划程序/策略,并调整合并因子。见下文

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().Searcher,当我获取完需要的文档后,我调用.Close(),我认为这已经足够了

我想我也可以尝试覆盖CreateSearcher(boolClose),以确保每次都打开一个新的阅读器,之后我会尝试一下。我对Sitecore如何处理Lucene及其读者/作者的了解还不够

我还尝试在web配置中使用UpdateInterval值,看看这是否有帮助,可惜没有

我非常感谢任何人a)知道可能发生这种情况的任何情况,以及b)任何潜在的建议/解决方案,因为我开始把头撞到一堵相当大的墙上:)

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

谢谢


詹姆斯。

当你试图为已经在编制索引的东西重新编制索引时,Lucene似乎会发疯。要验证这一点,请尝试以下操作:

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

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

  • 删除索引后,请尝试在Sitecore中重建索引,并等待此操作完成
  • 再次测试并查看是否出现这种情况
如果这种情况不再发生,将是
updateinterval
设置过低,导致索引(可能仍在构建中)被新索引覆盖(也不会完成),导致
segments.gen
文件包含错误的索引信息

.gen
文件将把您的
索引阅读器
指向哪些段是索引的一部分,并在索引重建后重新创建

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