我在内容管理环境中遇到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。
谢谢,
詹姆斯。
答案 0 :(得分:3)
当你试图重新索引正在被索引的过程中的东西时,Lucene似乎吓坏了。要验证这一点,请尝试以下操作:
将索引的updateinterval
设置为非常高的值(8小时)。
然后,停止w3wp.exe
并删除索引。
如果不再发生这种情况,那么updateinterval
设置得太低会导致您的索引(可能仍在构建中)被新的覆盖(也不会完成)导致您的segments.gen
文件包含错误的索引信息。
此.gen
文件会将您的indexreader
指向索引中的哪些细分,并在索引重建后重新创建。
这就是为什么我建议尝试在很长时间内禁用更新并手动重建它。