我正在开发一个Sitecore项目,该项目每天都有几个数据导入作业。每次执行某个作业时,它可能会更新大量的Sitecore项目(数千个),我注意到所有这些编辑都会触发Solr索引更新。
我担心的是,我不确定这是否更好或在工作结束时更新所有内容。所以,我很乐意尝试这两种选择。谁能告诉我如何使用代码暂时禁用Lucene / Solr索引并在以后编辑所有项目时启用它?
答案 0 :(得分:3)
这是一个常见的要求,你有这样的担忧是对的。一般来说,在大型导入作业中禁用索引,然后重建后,这被认为是一种很好的做法。
假设您使用的是Sitecore 7或更高版本,这就是您所需要的:
IndexCustodian.PauseIndexing();
IndexCustodian.ResumeIndexing();
以下是一篇全面的文章讨论:
http://blog.krusen.dk/disable-indexing-temporarily-in-sitecore-7/
答案 1 :(得分:3)
要在大型导入/更新任务期间禁用索引,您应该将逻辑包装在BulkUpdateContext
块中。您还可以使用其他包装器(如EventDisabler
)来阻止事件被触发(如果这在您的上下文中是合适的)。或者,您可以将代码包装在EditContext
中并将其设置为静默。所以你的代码最终可能是这样的:
using (new BulkUpdateContext())
using (new EditContext(targetItem, false, true))
{
// insert update logic here...
}
这是一个讨论此主题的旧问题:Optimisation tips when migrating data into Sitecore CMS
答案 2 :(得分:2)
除了@Martin的答案,你可以在完成项目的编辑后传递(silent = true),例如:
item.Editing.BeginEdit();
//Change fields values
item.Editing.EndEdit(true,true);
EndEdit()方法中的第二个参数强制对项目进行静默更新,这意味着在项目保存时不会触发事件/索引。
我觉得这比在导入过程中暂停整个应用程序级别的索引更安全,您只需跳过正在更新的项目的索引。
修改强>:
如果您需要在导入过程完成后重建更新项目的索引,您可以使用以下代码,它将从RootItemInTree及以下索引内容树:
var index = Sitecore.ContentSearch.ContentSearchManager.GetIndex("Your_Index_Name")
index.Refresh(new SitecoreIndexableItem(RootItemInTree));