防止项目的空语言版本被编入索引

时间:2015-10-23 12:50:32

标签: indexing solr sitecore

我们的解决方案中有20多种语言,只要我们上传新媒体或创建/编辑Sitecore项目,索引过程就会很慢。项目的空语言版本正在编制索引,这大大降低了索引的速度。有没有办法防止项目的空语言版本被索引?我猜我应该有一个管道,我可以利用它来拦截空项目并阻止它们被索引。

另外,通过阻止空版本索引可能会产生意想不到的后果吗?

由于

2 个答案:

答案 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+版本)

http://www.sitecore.net/learn/blogs/technical-blogs/sitecore-7-development-team/posts/2013/04/sitecore-7-inbound-and-outbound-filter-pipelines.aspx

在处理器中,您可以检查被编入索引的项目是否具有该项目语言的版本,并将IsExcluded属性更新为false。

只要您从索引获取结果的代码可以处理它,我就不会预见到过滤掉空项的任何问题。