我们的解决方案中有20多种语言,只要我们上传新媒体或创建/编辑Sitecore项目,索引过程就会很慢。项目的空语言版本正在编制索引,这大大降低了索引的速度。有没有办法防止项目的空语言版本被索引?我猜我应该有一个管道,我可以利用它来拦截空项目并阻止它们被索引。
另外,通过阻止空版本索引可能会产生意想不到的后果吗?
由于
答案 0 :(得分:2)
为了跟进并详细说明IsExcludedFromIndex
属性,我将提供一些示例。让我们使用一个示例索引定义:
<index id="homepage_nodes_index" type="Sitecore.ContentSearch.LuceneProvider.LuceneIndex, Sitecore.ContentSearch.LuceneProvider">
<param desc="name">$(id)</param>
<param desc="folder">$(id)</param>
<!-- This initializes index property store. Id has to be set to the index id -->
<param desc="propertyStore" ref="contentSearch/indexConfigurations/databasePropertyStore" param1="$(id)" />
<strategies hint="list:AddStrategy">
<!-- NOTE: order of these is controls the execution order -->
<strategy ref="contentSearch/indexConfigurations/indexUpdateStrategies/intervalAsyncMaster" />
</strategies>
<locations hint="list:AddCrawler">
<!--<crawler type="Sitecore.ContentSearch.SitecoreItemCrawler, Sitecore.ContentSearch">-->
<crawler type="Custom.Webcms.SitecoreUtil.Crawlers.customItemCrawler, Custom.Webcms.Sitecore">
<Database>master</Database>
<Root>/sitecore/content</Root>
</crawler>
</locations>
您可以在此处看到默认抓取工具类已替换为自定义抓取工具类。
您将像这样创建子类:
public class CustomItemCrawler : SitecoreItemCrawler
并覆盖IsExcludedFromIndex
属性,如下所示:
protected override bool IsExcludedFromIndex(SitecoreIndexableItem indexable, bool checkLocation = false)
{
Item obj = (Item)indexable;
Assert.ArgumentNotNull((object)obj, "item");
IDocumentBuilderOptions documentOptions = this.DocumentOptions;
Assert.IsNotNull((object)documentOptions, "DocumentOptions");
if (!obj.Database.Name.Equals(this.Database, StringComparison.InvariantCultureIgnoreCase))
{
Event.RaiseEvent("indexing:excludedfromindex", (object)this.index.Name, (object)obj.Uri);
return true;
}
else if (checkLocation && !this.RootItem.Axes.IsAncestorOf(obj))
{
Event.RaiseEvent("indexing:excludedfromindex", (object)this.index.Name, (object)obj.Uri);
return true;
}
else if (...)
{
Event.RaiseEvent("indexing:excludedfromindex", (object)this.index.Name, (object)obj.Uri);
return true;
}
else
{
if (!documentOptions.ExcludedTemplates.Contains(obj.TemplateID.ToString()))
return false;
Event.RaiseEvent("indexing:excludedfromindex", (object)this.index.Name, (object)obj.Uri);
return true;
}
}
答案 1 :(得分:1)
如果您需要在索引时过滤掉空项,可以尝试使用其中一个入站过滤器管道处理器。 (此解决方案仅适用于Sitecore 7+版本)
在处理器中,您可以检查被编入索引的项目是否具有该项目语言的版本,并将IsExcluded属性更新为false。
只要您从索引获取结果的代码可以处理它,我就不会预见到过滤掉空项的任何问题。