我正在尝试新的Sitecore 7.2功能 SwitchOnRebuildLuceneIndex
显然,此功能允许我以只读模式访问我的索引,同时我正在重建索引。
有没有办法在我重建索引的同时拥有完整的操作索引(不是只读)?
我正在进行的测试如下:
1)使用30k项目重建自定义索引(需要30秒)
2)同时索引正在重建:添加Sitecore项目(通过代码)
3)同时索引重建:访问自定义索引(通过代码)以获取项目数
4)索引完成重建后:访问自定义索引(通过代码)获取项目数
在步骤3中,它返回原始项目计数30000 在步骤4中,它返回更新的项目计数30001
感谢您的帮助 斯泰利奥
答案 0 :(得分:1)
我不相信这是可能的。从概念上讲,Sitecore本质上是一种软件,它使数据库更加用户友好,并定义了技术人员和非技术人员都能理解和遵循的结构。您所谈论的内容与ACID,数据库locks和transactions的概念背道而驰。我已经在您的步骤(内联,下面)中注释了更多技术(数据库)注释:
因此,步骤3返回新的项目数,步骤4返回原始项目。
答案 1 :(得分:0)
如果要跟踪索引重建期间发生的更改,可以使用IntervalAsynchronousStrategy作为索引重建策略。
<strategies hint="list:AddStrategy">
<intervalAsyncMaster type="Sitecore.ContentSearch.Maintenance.Strategies.IntervalAsynchronousStrategy, Sitecore.ContentSearch">
<param desc="database">master</param>
<param desc="interval">00:00:05</param>
<!-- whether full index rebuild should be triggered if the number of items in history engine exceeds ContentSearch.FullRebuildItemCountThreshold -->
<CheckForThreshold>true</CheckForThreshold>
</intervalAsyncMaster>
</strategies>
这将读取历史记录表并相应地更新您的索引。 如果您检查此类的Sitecore实现,您可以看到它处理重建事件。如果正在运行重建,则它不会执行任何操作并等待下次调度,并且如果重建已完成,则会从历史记录表中收集条目并将其应用于索引。请参阅类的Run方法:
...
if (IndexCustodian.IsIndexingPaused(this.index))
{
CrawlingLog.Log.Debug(string.Format("[Index={0}] IntervalAsynchronousUpdateStrategy triggered but muted. Indexing is paused.", this.index.Name), null);
}
else if (IndexCustodian.IsRebuilding(this.index))
{
CrawlingLog.Log.Debug(string.Format("[Index={0}] IntervalAsynchronousUpdateStrategy triggered but muted. Index is being built at the moment.", this.index.Name), null);
}
else
{
CrawlingLog.Log.Debug(string.Format("[Index={0}] IntervalAsynchronousUpdateStrategy executing.", this.index.Name), null);
HistoryEntry[] history = HistoryReader.GetHistory(this.Database, this.index.Summary.LastUpdated);
...