从索引全局排除克隆的项目?

时间:2013-12-17 23:22:04

标签: sitecore lucene.net sitecore7

我正在寻找一种优雅的方法来从我的网络索引中排除克隆的项目。我的搜索结果中的项目显示为重复项。如果只显示原始项目并且根本没有克隆,我更喜欢它。

我想到的一些可能的解决方案是:

  1. 如果项目的Global Item Boosting Rule字段不为空,请创建_Source以大幅降低提升值。这不是首选,因为它只会降低分数和不会从搜索结果中删除克隆。

  2. 使用扩展的Where子句排除我执行的每个查询中的克隆项。这也不是首选,因为这意味着我需要记住在所有查询中都包含此子句。此外,克隆的项目仍保留在索引中。

  3. Sitecore v7.1

2 个答案:

答案 0 :(得分:5)

您可以创建自定义搜寻器并在其中添加逻辑以排除克隆的项目 我想到的方法是创建一个继承自Sitecore.ContentSearch.SitecoreItemCrawler的类并覆盖DoAdd()方法。
像这样:

protected override void DoAdd(IProviderUpdateContext context, SitecoreIndexableItem indexable)
{
    Assert.ArgumentNotNull((object) context, "context");
    Assert.ArgumentNotNull((object) indexable, "indexable");

    if (!indexable.Item.IsClone)
    {
        base.DoAdd(context, indexable);
    }
}

然后,您需要设置抓取工具配置以使用自定义抓取工具 在Sitecore.ContentSearch.<Lucene/Solr>.Index.<databasename>.config文件中,您可以定义使用哪些抓取工具 您需要更新contentSearch/configuration/indexes/locations/crawler元素并指向那里的课程。

答案 1 :(得分:1)

我的方法是这样的:

public class InboundIndexFilter : InboundIndexFilterProcessor
{
    public override void Process(InboundIndexFilterArgs args)
    {
        var item = args.IndexableToIndex as SitecoreIndexableItem;

        if (item != null && (!item.Item.Versions.IsLatestVersion() || item.Item.IsClone))
        {
            args.IsExcluded = true;
        }
    }
}

它会跳过克隆和非最新版本。然后我更新了相应的管道设置:

 <indexing.filterIndex.inbound>
    <processor type="XY.InboundIndexFilter, X.Y.Z"/>
 </indexing.filterIndex.inbound>

More about inbound filters