我在我们的内容管理环境中遇到了 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。
谢谢,
詹姆士。