我正在寻找一种优雅的方法来从我的网络索引中排除克隆的项目。我的搜索结果中的项目显示为重复项。如果只显示原始项目并且根本没有克隆,我更喜欢它。
我想到的一些可能的解决方案是:
如果项目的Global Item Boosting Rule
字段不为空,请创建_Source
以大幅降低提升值。这不是首选,因为它只会降低分数和不会从搜索结果中删除克隆。
使用扩展的Where子句排除我执行的每个查询中的克隆项。这也不是首选,因为这意味着我需要记住在所有查询中都包含此子句。此外,克隆的项目仍保留在索引中。
Sitecore v7.1
答案 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>