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

インデックス検索

岡田

岡田

Solrの項目に入らないフィールドの追加方法について

前回からの続き

Solr検索時に考慮した方が良い項目についてでお話した、デフォルトでSolrに入っていない項目の追加方法についてお話したいと思います。

前回の記事の「パブリッシュ制限について」でご説明した6項目(フィールド)を例に挙げて説明します。

    if(Sitecore.Configuration.State.Previewing)
    {
        // プレビュー日時で設定した時間
        dateTime = Sitecore.Configuration.State.PreviewDate.ToLocalTime();
    }
    else
    {
        // 現在の時刻
        dateTime = DateTime.Now;
    }

    context.GetQueryable<CustomSearchResultItem>().Where(x => !x.NeverPublish)
                                            .Where(x => x.Publish <= dateTime)
                                            .Where(x => x.Unpublish >= dateTime || (x.Unpublish >= DateTime.MinValue && x.Unpublish <= DateTime.MinValue))
                                            .Where(x => !x.HideVersion)
                                            .Where(x => x.ValidFrom <= dateTime)
                                            .Where(x => x.ValidTo >= dateTime || (x.ValidTo >= DateTime.MinValue && x.ValidTo <= DateTime.MinValue));

・アイテムのパブリッシュ禁止(パブリッシュ禁止フィールド[__Never publish])
※上記コード内のNeverPublish
・アイテムのパブリッシュ開始日(パブリッシュ期間 開始日時フィールド[__Publish])
※上記コード内のPublish
・アイテムのパブリッシュ終了日(パブリッシュ期間 終了日時フィールド[__Unpublish])
※上記コード内のUnpublish
・バージョンのパブリッシュ禁止(バージョンを非表示にするフィールド[__Hide version])
※上記コード内のHideVersion
・バージョンのパブリッシュ開始日(開始日時フィールド[__Valid from])
※上記コード内のValidFrom
・バージョンのパブリッシュ終了日(終了日時フィールド[__Valid to])
※上記コード内のValidTo

上の画像はクリーンインストール時のSitecoreのSolrのインデックスを表示しています。
Solrの管理画面を開き、各フィールドを検索してみてください。「パブリッシュ制限について」でご説明した6項目(フィールド)はないと思います。
今回行う作業によって上記6項目を「_indexname」や「_language」のようにsolrの1項目(フィールド)として追加することができます。

追加方法(スタンダードフィールド)

ここでは、Sitecore9.1.0への追加方法をご説明します。
パブリッシュ制限に関する6項目(フィールド)は、Sitecoreのスタンダードフィールドと呼ばれるフィールド郡です。
これら一部の項目(フィールド)は、デフォルトではインデックスの項目に入らないように除外設定がされています。

Sitecoreのインストールフォルダ\App_Config\Sitecore\ContentSearch\Sitecore.ContentSearch.Solr.DefaultIndexConfiguration.config
上記パスが示すファイルの中に「hint="list:AddExcludedField"」という項目があります。
この項目内で、NeverPublish、Publish、UnPublish、HideVersion、__ValidFrom、ValidToという項目(フィールド)を削除します。
また、削除だけでは追加が行われないため、「hint="raw:AddFieldByFieldName"」項目に追加もしてください。
上記パスが示すファイルを直接編集するのではなく、パッチファイルとして作成する場合のコードサンプルを添付しておきます。

    
        
            
            
                
                
                    
                    
                    
                    
                    
                    
                    
                    
                
                
                    
                        
                            {9135200A-5626-4DD8-AB9D-D665B8C11748}
                        
                        
                            {86FE4F77-4D9A-4EC3-9ED9-263D03BD1965}
                        
                        
                            {7EAD6FD6-6CF1-4ACA-AC6B-B200E7BAFE88}
                        
                        
                            {B8F42732-9CB8-478D-AE95-07E25345FB0F}
                        
                        <__ValidFrom>
                            {C8F93AFE-BFD4-4E8F-9C61-152559854661}
                        
                        
                            {4C346442-E859-4EFD-89B2-44AEDF467D21}
                        
                    
                
                
            
            
        
    

パッチファイルを適用後、Sitecoreの管理画面にアクセスし、インデックスの再構築を行います。
インデックスの再構築の方法はラウンチパッドからコントロールパネルを選択します。

コントロールパネル内の「インデックス」カテゴリの「インデックス マネージャーを開く」を選択します。

更新したいインデックスを選択し「再構築」を押下します。今回は「すべて」を選択して再構築を行います。

再構築が完了すると、各項目(フィールド)が追加されていると思います。

追加のフィールド

スタンダードフィールドは上記のようにconfigファイルを変更するのみの対応で、Solrの項目(フィールド)を追加することができます。
しかし、アイテムのバージョンを上げることで初期値が入らないなどの場合では、プログラム内のロジックで値を制御します。
こういった場合に使用する方法について記載していきます。

「IComputedIndexField」を継承したクラスを作成し、どのようなロジックでどのような値を返すか処理を書きます。
例として、ValidFromの初期値に対して、フィールドに値があろうがなかろうがMinValueを入れる場合のサンプルコードを示します。

    using Sitecore.ContentSearch;
    using Sitecore.ContentSearch.ComputedFields;
    using Sitecore.Data.Items;
    using System;

    namespace Test.Sitecore.ContentSearch
    {
        public class ValidFromField : IComputedIndexField
        {
            public object ComputeFieldValue(IIndexable indexable)
            {
                DateTime PublishDefaultValue = DateTime.MinValue;

                var item = (Item)(indexable as SitecoreIndexableItem);
                if (item == null) return null;

                if (string.IsNullOrEmpty(item[Sitecore.FieldIDs.ValidFrom]))
                {
                    return PublishDefaultValue;
                }

                return Sitecore.DateUtil.IsoDateToDateTime(item[Sitecore.FieldIDs.ValidFrom]);
            }

            public string FieldName { get; set; }

            public string ReturnType { get; set; }
        }
    }
上述した様に「Sitecore.ContentSearch.Solr.DefaultIndexConfiguration.config」の「hint="raw:AddComputedIndexField"」にSolrに追加したい項目(フィールド)を追加します。
パッチファイルのサンプルを示します。
※「Test.Sitecore.ContentSearch.ValidFromField」の部分には作成したコードの「namespace」を「Test」の部分には「dll名」を入れてください。
    
        
            
                
                    
                        
                            
                                Test.Sitecore.ContentSearch.ValidFromField, Test
                            
                        
                    
                
            
        
    
加えて、定義した「ComputedField」を使用するために「SearchResultItem」を継承したモデルを作成します。Solrでの検索の際には作成したモデルを使用して検索を行います。
下記はモデルを作成する際のサンプルコードです。
    using Sitecore.ContentSearch;
    using Sitecore.ContentSearch.SearchTypes;
    using System;
    
    namespace Test.Sitecore.ContentSearch.SearchResultItemModel
    {
        public class CustomSearchResultItem : SearchResultItem
        {
            [IndexField("validfrom")]
            DateTime ValidFrom { get; }
        }
    }
作成したdllとconfigファイルを配置して、Sitecoreの管理画面に入り、インデックスを再構築します。
※再構築方法は本記事に記載している方法と同じです。
正しく定義が行われて、インデックスの再構築が完了している場合、"validfrom_tdt"という項目(フィールド)が新しくできていると思います。
この項目(フィールド)は"[IndexFieldで定義した名前]_[型]"という命名規則で定義されます。

上記の方法を使用することで思い通りにSolrの項目を作成し、検索をカスタマイズすることができます。

以上です。



※エントリーの内容・画像等は、公開時点での情報に基づきます。
※Sitecoreのバージョンによって実装されている機能が異なります。

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

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

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

Sitecoreの運用問題を解決する

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