Context.SiteおよびSecurityStateが計算インデックス フィールドから欠落する


説明

インデックス作成速度の向上のために、検索インデックスは複数スレッドで更新・再構築されます。

これらの並列処理は、いくつかの段階で実施されています:

デフォルトでは、検索インデックスはshellサイトのコンテキストで更新されます。
しかし、計算インデックス フィールドでは、コンテキスト サイトの情報が欠落する場合があり、それによりContext.Siteにアクセスするコードがエラーで失敗する場合があります。例えば、アイテムのURLをインデックス作成中に作成すると、次のようなエラーが発生する可能性があります。

エラー例1:

ERROR Error in CustomComputedField
Exception: System.NullReferenceException
Message: Object reference not set to an instance of an object.
Source: Sitecore.Kernel
at Sitecore.Links.UrlBuilders.ItemUrlBuilder.AddServer(UrlBuildModel model, ItemUrlBuilderOptions options)
at Sitecore.Links.UrlBuilders.BaseUrlBuilder`1.BuildUrl(UrlBuildModel model, TOptions options)

エラー例2:

WARN Could not compute value for ComputedIndexField
Exception: System.NullReferenceException
Message: Object reference not set to an instance of an object.
Source: Sitecore.Kernel
at Sitecore.Links.UrlBuilders.DefaultMediaUrlBuilderOptions.get_Site()
at Sitecore.Links.UrlBuilders.MediaUrlBuilderOptions.get_Site()
at Sitecore.Links.UrlBuilders.MediaUrlBuilder.AddServer(UrlBuildModel model, MediaUrlBuilderOptions options)
at Sitecore.Links.UrlBuilders.BaseUrlBuilder`1.BuildUrl(UrlBuildModel model, TOptions options)

デフォルトでは、検索インデックスはSecurityDisablerのコンテキストで更新されます。これはインデックス作成プロセスが、すべてのアイテムおよびすべてのフィールドに権限チェックのオーバーヘッドなしでアクセスできることを意味します。
しかし、計算インデックス フィールドでSecurityDisablerが無効化される可能性があるため、インデックス作成プロセスが一部のアイテムまたは一部のフィールドにアクセスできない場合があります。

オプション1

計算インデックス フィールドのインデックス作成が並列に実施されないようにするには、「\App_Config\Include\zzz」フォルダーで設定パッチ ファイルを作成してください。

<configuration xmlns:patch="http://www.sitecore.net/xmlconfig/" xmlns:set="http://www.sitecore.net/xmlconfig/set/">
  <sitecore>
    <settings>
      <setting name="ContentSearch.ComputedFields.ParallelIndexing.Enabled" set:value="false" />
    </settings>
  </sitecore>
</configuration>

註:このアプローチではコードの変更は不要です。その他の段階の並列インデックス作成への影響はありませんが、計算フィールドが連続して追加されるため、インデックスの更新および再構築にかかる時間が長くなる可能性があります。

オプション2

SecurityDisablerおよびSiteContextSwitcherのクラスを使用して正しいコンテキスト値を設定します。

using Sitecore.Configuration;
using Sitecore.SecurityModel;
using Sitecore.Sites;
...
public override object ComputeFieldValue(IIndexable indexable)
{            
   using (new SecurityDisabler())
   {
       using (new SiteContextSwitcher(new SiteContext(Factory.GetSiteInfo("shell"))))
       {
           //logic of the custom computed index field
       }
   }
}

註:このアプローチでは、対象フィールドのソース コードへのアクセスが必要となりますが、インデックス作成プロセスの速度を低下させることなく問題を防ぐことができます。

参考資料

KB1001939に、フィールド レベルの言語フォールバックに関する類似の問題の詳細情報が記載されています。