如何在编辑项目时暂时禁用sitecore索引

时间:2015-07-23 05:37:45

标签: solr lucene sitecore data-migration

我正在开发一个Sitecore项目,该项目每天都有几个数据导入作业。每次执行某个作业时,它可能会更新大量的Sitecore项目(数千个),我注意到所有这些编辑都会触发Solr索引更新。

我担心的是,我不确定这是否更好或在工作结束时更新所有内容。所以,我很乐意尝试这两种选择。谁能告诉我如何使用代码暂时禁用Lucene / Solr索引并在以后编辑所有项目时启用它?

3 个答案:

答案 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));