初めに
SitecoreによってSolrインデックスの更新がされるタイミングは、sitecore_web_indexのデフォルトの設定であればアイテムがパブリッシュされた時に更新が行われます。
パブリッシュされたアイテムに関してはSolrインデックスの更新が行われますが、パブリッシュされていないアイテムに関してはインデックスの更新は行われません。
ここでは、GetDependencyパイプラインをカスタマイズして、パブリッシュされていない関連アイテムのSolrインデックスを更新する方法をご紹介します。
Sitecoreは 10.1.0を想定しています。
GetDependencyパイプライン
例として以下画像のようなアイテム構造を想定し、content配下のtopアイテムをパブリッシュした時に、その配下のchildアイテムのSolrインデックスも更新が行われるようにします。
Solrインデックスへの更新のトリガーをカスタマイズするには、GetDependencyパイプラインを利用します。
GetDependencyパイプラインはインデックスの作成に依存するアイテムを取得します。
ここではSample ItemテンプレートのアイテムがWebDBにパブリッシュされた場合に、パブリッシュされたアイテムの子アイテムのインデックスを更新する"DependencyTest"クラスを作成しています。
注意点として、すべてのアイテム更新にトリガーされるため、テンプレートやアイテムパスなどで更新対象かどうかの判定を行い、
対象のアイテムではない場合にすぐに処理を終了するように実装して、余計な処理が発生しないようにする必要があります。
public class DependencyTest : BaseProcessor
{
public override void Process(GetDependenciesArgs args)
{
var scIndexable = args.IndexedItem as SitecoreIndexableItem;
if (scIndexable == null) return;
var item = scIndexable.Item;
if (item == null) return;
// WebDBではない場合スキップ
if (item.Database.Name != "web") return;
// 更新したアイテムのテンプレートが "Sample Item"ではない場合はスキップ
if (item.TemplateID.ToString() != "{76036F5E-CBCE-46D1-AF0A-4143F9B557AA}") return;
foreach (Item child in item.Children)
{
var id = (SitecoreItemUniqueId)child.Uri;
if (!args.Dependencies.Contains(id))
{
args.Dependencies.Add(id);
}
}
}
}
最後にSitecoreの設定を上書きするためのパッチファイルを作成し、Sitecoreインスタンスの\App_Config\Include配下に配置します。
<configuration xmlns:patch="http://www.sitecore.net/xmlconfig/">
<sitecore>
<pipelines>
<indexing.getDependencies help="Processors should derive from Sitecore.ContentSearch.Pipelines.GetDependencies.BaseProcessor">
<processor type="{ namespace }.DependencyTest, { dll }"/>
</indexing.getDependencies>
</pipelines>
</sitecore>
</configuration>
Solrインデックスの更新を確認
確認としてtopアイテム(/sitecore/content/home/top)のみWebDBへパブリッシュを行います。
下記画像はSolrのsitecore_web_indexの値で、topとchildアイテムの"_indextimestamp"が同じ時間に更新されていることが確認できます。
以上です。
※エントリーの内容・画像等は、公開時点での情報に基づきます。
※Sitecoreのバージョンによって実装されている機能が異なります。