Solrフィールド名解決の利用

Version:
日本語翻訳に関する免責事項

このページの翻訳はAIによって自動的に行われました。可能な限り正確な翻訳を心掛けていますが、原文と異なる表現や解釈が含まれる場合があります。正確で公式な情報については、必ず英語の原文をご参照ください。

検索プロバイダーとしてのSolrは、文書のインデックス作成や検索の慣習を規定します。Sitecore文書(アイテム)をSolrに送ってインデックス作成を行う場合、アイテムフィールドはSolrフィールドにマッピングしなければなりません。マッピングの例として、Sitecore Item NameフィールドがSolr _nameフィールドにマッピングされる場合があります。

残念ながら、大量のSitecoreフィールドをSolrフィールドに手動でマッチングするのは実用的ではありません。しかし、Solr動的フィールド を使ってSitecoreフィールドの自動マッピングを行うことは可能です。

自動写像の例として、SitecoreがSitecore parsedcreatedby計算された文字列フィールドをSolr parsedcreatedby_s動的文字列フィールドにマッピングする場合があります。これはparsedcreatedbyが*_sフィールド名形式にマッピングされたSitecore stringインデックスフィールドタイプに関連付けられているためです。

すべてのマッピングはSitecore.ContentSearch.Solr.DefaultIndexConfiguration.configファイル内で指定されています。

現在の構成はすべてのSitecoreフィールドタイプをカバーしています。しかし、フィールドタイプのマッピングが欠けている場合、SitecoreはSolrスキーマで定義されたフィールドと照合してフィールド名をマッピングしようとします。一致が見つからなければ、Sitecoreはフィールド値タイプを使ってマッピングを決定します。

インデックス作成時のフィールド名解決

例えば、amountというSitecoreフィールドを考えてみましょう。これは数値を保持するため、Sitecore number型フィールドです。Sitecoreフィールドが 名前で インデックスフィールドタイプに手動でマッピングされていない場合、Sitecore Sitecoreフィールドタイプによって 自動的に以下の順序でSolr動的フィールドにマッピングします。

  1. SitecoreはSitecore number型フィールドをAddFieldByFieldTypeNameセクションのSolr float型フィールドに写します。

    ...
  2. Sitecore Solr floatタイプのフィールドをAddTypeMatchセクションの{0}_tfフィールド名形式にマッピングしています:

    ...
  3. Sitecore {0} 部分をSitecore amountフィールド名に置き換え、Solr amount_tfフィールド名にします。

  4. Sitecore amountというSitecore number型フィールドをSolr動的float型フィールドamount_tfとしてインデックス付けします。

フィールド名によるマッピングの上書き

SitecoreAddFieldByFieldNameセクションの各フィールドのAddFieldByFieldTypeNameセクションのマッピングを上書きできます。例えば、この機能を使ってSitecore titleフィールドをSolr textタイプのフィールドとしてインデックス付けすることができますtitle_t。SitecoreはSolrフィールドタイプに合わせるためにフィールドタイプではなくSitecoreフィールド名を使用します。

...

Sitecoreフィールド名を探す際、正確な名前に一致しようとします。もし完全に一致しなければSitecore、文化的接尾辞やSolr動的フィールド接尾辞をすべて削除し、再挑戦します。例えば、以下のフィールド名はtitleフィールドにマッピングされます。

  • Title_en- 英語ISO言語コードと一致する_en

    同様に、_da、_de、そして以下にも当てはまります。

  • Title_t - _t接尾辞がテキストタイプ形式、より具体的には動的フィールド *_tに対応している場合。

    同様に、_s、_sm、そして以下にも当てはまります。

計算フィールドのインデックス化

Sitecore計算された場Sitecore AddComputedIndexField節およびAddTypeMatch節のSolr動的場に写像します。例えば、Sitecore Sitecore calculateddimension計算された場をSolr stringCollection型フィールドに写し、それをcalculateddimension_smとしてインデックス付けします。

Sitecore.ContentSearch.ComputedFields.CalculatedDimension,Sitecore.ContentSearch ... ... ## フィールド名の検索時の解析

Sitecoreは検索中にフィールドを同様に解決します。

例えば、title

、Sitecore titleフィールドタイプを以下の順序でSolrフィールド名形式に解決します。

  1. 名前で解決してください。

    Sitecoreはフィールド名から言語の接尾辞(_en、_daなど)や動的フィールド接尾辞(_t、_s、_smなど)を削除し、AddFieldByFieldName構成を検索して一致を探します。一致が見つからなければ、Sitecore Solrスキーマで定義されたSolrフィールド名の一致を探します。

  2. CLRの検索値で解決します。

    Sitecoreフィールド名で解決できない場合は、CLR型を使って設定AddTypeMatchと照合します。この例では、CasablancaのCLR型がSystem.Stringされ、System.Stringの最初のAddTypeMatch構成でタイトル名を解決します。以下のAddTypeMatch構成では、最初のエントリがlowercaseStringされ、titleフィールドはtitle_lsとして解決されます。

  3. テンプレートを見つけて解決しましょう。

    Sitecoreが名前やCLRタイプでフィールドを解決できない場合は、同じ名前のテンプレートフィールドを探します。複数のテンプレートフィールドが見つかれば、最初のものが使われます。テンプレートフィールドを特定したら、Sitecoreがテンプレートフィールドを特定すれば、そのフィールドの型をAddFieldByFieldTypeNameと照合します。

LINQでの検索

SitecoreがLINQを使って強型付けのプロパティを持つ検索リクエストを実行する際、Sitecoreプロパティの.NETランタイム型を用いてAddTypeMatchセクションのSolrフィールド名を解決します。

var queryable = index.CreateSearchContext().GetQueryable< CustomSearchResultItem >(); var q = queryable.Where(i => i.Airport.Equals("search term")).ToList();

public class CustomSearchResultItem : SearchResultItem { IndexField("Airport") DataMember public virtual string Airport { get; set; } }

しかし、SitecoreがAddTypeMatchセクション内の複数の.NETランタイムタイプにフィールドタイプ名をマッピングできる場合、Sitecoreテンプレートリゾルバを使ってSolrにテンプレートとフィールドタイプを問い合わせます。

例えば、Sitecore airportプロパティはAddTypeMatchセクションのstringとtext .NETのランタイム型の両方にマッピングするSystem.String型です。これにより、2つのフィールド名フォーマット({0}_sと{0}_t)と2つのSolr動的フィールド名(airport_sとairport_t)が得られます。

...

Sitecoreはテンプレートリゾルバを使ってSolrにテンプレートとフィールドタイプを照会します(順序は以下の通りです):

  1. SitecoreはリゾルバリクエストをSolrに送信します。例えば:

    /select?q=_name:(airport)&fq=_templatename:("Template+field")&fq=_indexname:(sitecore_master_index)&rows=10&version=2.2}

    !重要例えば、2つのテンプレートが同じフィールド(例えばairportフィールド)を定義している場合、テンプレートリゾルバは2つの結果を未定の順序で返します。Sitecoreは常に最初の結果を選び、解決が一貫しません。これは特に、airportが一つのテンプレートでシングルラインテキストフィールドタイプ、別のテンプレートでドロップリストフィールドタイプとして定義されている場合に深刻です。

  2. SolrはSitecoreAddFieldByFieldTypeNameセクションのSolr textフィールドタイプに対応するsingle-line textフィールドタイプを返します。

  3. Sitecore Solr textフィールドタイプをAddTypeMatchセクションの{0}_tフィールド名形式にマッピングしています:

  4. Sitecore {0} 部分をSitecore airportプロパティ名に置き換え、Solr airport_tフィールドに解決します。

  5. SitecoreはSolrに最後の検索クエリを送信します:

    /select?q=_airport_t:”search term”&fq=_indexname:(sitecore_master_index)

テンプレートが正しくインデックスされていることの確保

Sitecore Content Searchは、正しいフィールドタイプ解像度に基づく完全かつ満足のいく検索結果を提供するために、テンプレートがインデックス化されることに依存しています。テンプレートをインデックス化しない設定の例は以下の通りです:

  • クローラーのRootタグで、/sitecore/templatesサブツリーは含まれていません:

      master   /sitecore/content

  • テンプレートのフィールド項目を除外するように設定されているインデックスドキュメントオプション:

    {455A3E98-A627-4B40-8035-E683A0331AC7}

設定上必要な場合は、TemplateIndexNameタグを追加してテンプレートがインデックス化されていることを確認してください。タグは、/sitecore/templatesルートの下のすべてのテンプレートフィールド項目をクローラーがインデックスするインデックスを指ささなければなりません:

... TEMPLATE INDEX NAME

TemplateIndexNameが指定されると、Sitecore Content SearchはSolrへのクエリで使用されるSitecoreフィールドのSolrマッピングを正しく解決できます。テンプレートのインデックス化失敗は、検索リクエストの失敗や検索結果の空白を引き起こすことがあります。

この記事を改善するための提案がある場合は、 お知らせください!