4

我在我们的内容管理环境中遇到了 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(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().Searcher,当我完成获取所需的文档时,我调用 .Close(),我认为这已经足够了。

我在想我或许也可以尝试覆盖 CreateSearcher(bool close),以确保我每次都打开一个新的阅读器,我会在此之后尝试一下。我真的不太了解 Sitecore 如何处理 Lucene,它的读者/作者?

我还尝试使用 Web 配置中的 UpdateInterval 值来查看是否有帮助,可惜没有。

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

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

谢谢,

詹姆士。

4

1 回答 1

3

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

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

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

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

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

.gen文件将指出indexreader哪些段是索引的一部分,并在索引重建后重新创建。

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

于 2013-08-16T10:25:22.223 回答