
あるプロジェクトで、サイトノード内に複数のマイクロサイトがあるが、メインサイトの検索機能にはメインサイトのページのみを含み、マイクロサイトのページは含まないようにしたいという要件がありました。
サイトコアの検索インデックスの設定では、<documentOptions>セクションで、テンプレートを含める/除外することや、インデックスに含めるフィールドを設定することが簡単にできます。しかし、現在のところ、サイトコアのツリー内のパスに基づいてインデックスからアイテムを除外する方法はありません。
これを可能にするために、カスタムクローラーを作成し、無視するように設定されたパスに基づいて、アイテムを含めるかどうかを決定しました。
このソリューションでは、すべてのアイテムがクロールされますが、インデックスには条件付きで含まれることになります。
カスタムクローラーの設定を更新し、除外するパスを設定できるようにしました。(この例ではマイクロサイトノードへのパス)。
留意:ここでのスニペットは、Sitecore 10インスタンスでのものです。
<?xml version="1.0" encoding="utf-8"?>
<configuration xmlns:patch="http://www.sitecore.net/xmlconfig/" xmlns:role="http://www.sitecore.net/xmlconfig/role/" xmlns:search="http://www.sitecore.net/xmlconfig/search/">
<sitecore role:require="Standalone or ContentManagement" search:require="solr">
<contentSearch>
<configuration type="Sitecore.ContentSearch.ContentSearchConfiguration, Sitecore.ContentSearch">
<indexes hint="list:AddIndex">
<index id="site_master_index" type="Sitecore.ContentSearch.SolrProvider.SolrSearchIndex, Sitecore.ContentSearch.SolrProvider">
<param desc="name">$(id)</param>
<param desc="core">site_master_index</param>
<param desc="propertyStore" ref="contentSearch/indexConfigurations/databasePropertyStore" param1="$(id)" />
<strategies hint="list:AddStrategy">
<strategy ref="contentSearch/indexConfigurations/indexUpdateStrategies/manual" role:require="ContentManagement and !Indexing" />
<strategy ref="contentSearch/indexConfigurations/indexUpdateStrategies/intervalAsyncMaster" role:require="Standalone or (ContentManagement and Indexing)" />
</strategies>
<locations hint="list:AddCrawler">
<crawler type="Site.Website.Infrastructure.Search.Crawler.ExcludePathsItemCrawler, Site.Website.Infrastructure">
<Database>master</Database>
<Root>/sitecore/content/home</Root>
<ExcludeItemsList hint="list">
<ChicagoMetro>/home/chicago-metro</ChicagoMetro>
<MemphisEast>/home/memphis-east</MemphisEast>
</ExcludeItemsList>
</crawler>
</locations>
</index>
</indexes>
</configuration>
</contentSearch>
</sitecore>
</configuration>
このインデックスの設定で重要なのは、Crawler / ExcludeItemsListのセクションです。
このセクションを読み、パスを使って条件付きでアイテムをインデックスに含めたり除外したりするコードを紹介します。ここでは、アイテムが除外されているかどうかをチェックするために使用されるデフォルトのメソッドをオーバーライドしています。
using Sitecore.ContentSearch;
using Sitecore.Diagnostics;
using System.Collections.Generic;
using System.Linq;
namespace Site.Website.Infrastructure.Search.Crawler
{
public class ExcludePathsItemCrawler : SitecoreItemCrawler
{
public List<string> ExcludeItemsList { get; } = new List<string>();
protected override bool IsExcludedFromIndex(SitecoreIndexableItem indexable, bool checkLocation = false)
{
Assert.ArgumentNotNull(indexable, "item");
return ExcludeItemsList.Any(path => indexable.AbsolutePath.StartsWith(path))
|| base.IsExcludedFromIndex(indexable, checkLocation);
}
}
}
これで完了です。ここでのパブリックプロパティは、自動的に設定をマッピングしてくれるので、そのままコードで使用することができます。
このメソッドを使って、必要に応じてクローラーをカスタマイズすることもできます。パスの制約を追加する以外は、好きなように設定することができます。