SITECORE MANIA 開発者向け技術ブログ

インデックス検索

中川

中川

パブリッシュ時に関連アイテムのSolrインデックスを更新する方法

初めに

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のバージョンによって実装されている機能が異なります。

この記事を読んだ人はこちらの記事も読んでます

Sitecore導入に関するご相談・資料ダウンロード

導入をご検討・ご依頼の方や、サービスについてご不明点がございましたらお気軽にお問い合わせください。

Sitecoreの運用問題を解決する

既にSitecoreを導入しているお客様向けサービス