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

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

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

Solrは、検索プロバイダーとして、ドキュメントのインデックス作成と検索の規則を規定します。Sitecoreがインデックス作成のためにドキュメント (アイテム) をSolrに送信する場合、アイテム フィールドはSolrフィールドにマッピングする必要があります。マッピングの例としては、Sitecore Item NameフィールドがSolr _nameフィールドにマッピングされる場合があります。

残念ながら、多数のSitecoreフィールドを手動でSolrフィールドに一致させることは現実的ではありません。ただし、Solr動的フィールド を使用して、Sitecoreフィールドの自動マッピングを実行できます。

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

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

現在の設定は、すべてのSitecoreフィールド タイプをカバーしています。ただし、フィールド タイプのマッピングがない場合、SitecoreはSolrスキーマで定義されたフィールドと照合することで、フィールド名のマッピングを試みます。一致するものが見つからない場合、Sitecoreはフィールド値のタイプを使用してマッピングを決定します。

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

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

  1. Sitecoreは、AddFieldByFieldTypeNameセクションのSitecore numberタイプ フィールドをSolr floatタイプ フィールドにマッピングします。

    <fieldTypes hint="raw:AddFieldByFieldTypeName">
      <fieldType fieldTypeName="number" returnType="float" />
      ...
    </fieldType>
  2. Sitecoreは、Solr floatタイプ フィールドをAddTypeMatchセクションの {0}_tfフィールド名形式にマッピングします。

    <typeMatches hint="raw:AddTypeMatch">
      <typeMatch
        typeName="float"
        type="System.Single"
        fieldNameFormat="{0}_tf"
        settingType="Sitecore.ContentSearch.SolrProvider.SolrSearchFieldConfiguration,
          Sitecore.ContentSearch.SolrProvider"
      />
      ...
    </typeMatches>
  3. Sitecoreは、{0} の部分をSitecore amountフィールド名に置き換えて、Solr amount_tfフィールド名にします。

  4. Sitecoreは、amountという名前のSitecore numberタイプ フィールドをSolr動的floatタイプ フィールド (amount_tfとしてインデックス付けします。

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

Sitecoreは、AddFieldByFieldNameセクションの各フィールドのAddFieldByFieldTypeNameセクションのマッピングを上書きできます。この機能を使用すると、たとえば、Sitecore titleフィールドをSolr textタイプ フィールドとしてインデックスを作成できますtitle_t。Sitecoreは、Solrフィールド タイプと一致するように、フィールド タイプではなくSitecoreフィールドnameを使用します。

<fieldTypes hint="raw:AddFieldByFieldName">
  <field fieldName="title" returnType="text" />
  ...
</fieldTypes>

Sitecoreは、フィールド名を検索するときに、名前と完全に一致しようとします。完全に一致するものがない場合、Sitecoreはカルチャ サフィックスとSolr動的フィールド サフィックスを削除して、再試行します。たとえば、次のフィールド名はtitleフィールドにマップされます。

  • Title_en - _enは英語のISO言語コードと一致します。

    _da_deなども同様です。

  • Title_t - _tサフィックスは、テキスト タイプの形式、より具体的には動的フィールド *_tと一致します。

    _s_smなども同様です。

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

Sitecoreは、Sitecoreの計算フィールドをAddComputedIndexFieldセクションとAddTypeMatchセクションのSolr動的フィールドにマッピングします。たとえば、SitecoreはSitecore calculateddimension計算フィールドをSolr stringCollectionタイプ フィールドにマッピングし、次のようにインデックスを作成しますcalculateddimension_sm

<fields hint="raw:AddComputedIndexField">
  <field fieldName="calculateddimension" returnType="stringCollection">
  Sitecore.ContentSearch.ComputedFields.CalculatedDimension,Sitecore.ContentSearch
  </field>
  ...
</fields>

<typeMatches hint="raw:AddTypeMatch">
  <typeMatch
    typeName="stringCollection"
    type="System.Collections.Generic.List`1[System.String]"
    fieldNameFormat="{0}_sm"
    multiValued="true"
    settingType="Sitecore.ContentSearch.SolrProvider.SolrSearchFieldConfiguration,
      Sitecore.ContentSearch.SolrProvider"
  />
  ...
</typeMatches>

検索中のフィールド名解決

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

たとえば、title:Casablancaを検索すると、Sitecoreはtitleフィールド タイプを次の順序でSolrフィールド名形式に解決します。

  1. 名前で解決します。

    Sitecoreは、フィールド名から言語サフィックス (_en_daなど) または動的フィールド サフィックス (_t_s_smなど) を削除し、AddFieldByFieldName設定を検索して一致するものを見つけます。一致するものが見つからない場合、SitecoreはSolrスキーマで定義されたSolrフィールド名で一致するものを探します。

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

    Sitecoreが名前でフィールドを解決できない場合、SitecoreはCLRタイプを使用して、設定されたAddTypeMatchと照合します。この例では、CLRの種類 "Casablanca" がSystem.Stringで、System.Stringの最初のAddTypeMatch構成を使用してタイトル名が解決されます。 次のAddTypeMatch設定では、最初のエントリがlowercaseStringされるため、titleフィールドはtitle_lsとして解決されます。

    <typeMatches hint="raw:AddTypeMatch">
                  <typeMatch typeName="lowercaseString" 
                    type="System.String"  
                    fieldNameFormat="{0}_ls" 
                    settingType="Sitecore.ContentSearch.SolrProvider.SolrSearchFieldConfiguration, 
                    Sitecore.ContentSearch.SolrProvider" />
                  <typeMatch typeName="string" 
                    type="System.String" 
                    fieldNameFormat="{0}_s" 
                    settingType="Sitecore.ContentSearch.SolrProvider.SolrSearchFieldConfiguration, 
                    Sitecore.ContentSearch.SolrProvider" /> 
                  <typeMatch typeName="text" 
                    type="System.String" 
                    fieldNameFormat="{0}_t" 
                    cultureFormat="_{1}" 
                    settingType="Sitecore.ContentSearch.SolrProvider.SolrSearchFieldConfiguration, 
                    Sitecore.ContentSearch.SolrProvider" 
                  />
                </typeMatches>
  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ランタイム タイプmultipleにマッピングできる状況では、Sitecoreはテンプレート リゾルバーを使用して、テンプレートとフィールド タイプをSolrに問い合わせます。

たとえば、Sitecore airportプロパティは、AddTypeMatchセクションのstringtextの両方の .NETランタイム タイプにマッピングされるSystem.Stringタイプです。この結果、2つのフィールド名形式 ({0}_s{0}_t) と2つのSolr動的フィールド名 (airport_sairport_tが得られます。

<typeMatches hint="raw:AddTypeMatch">
  <typeMatch
    typeName="string"
    type="System.String"
    fieldNameFormat="{0}_s"
    settingType="Sitecore.ContentSearch.SolrProvider.SolrSearchFieldConfiguration, 
      Sitecore.ContentSearch.SolrProvider"
  />
  <typeMatch
    typeName="text"
    type="System.String"
    fieldNameFormat="{0}_t"
    cultureFormat="_{1}"
    settingType="Sitecore.ContentSearch.SolrProvider.SolrSearchFieldConfiguration, 
      Sitecore.ContentSearch.SolrProvider"
  />
  ...
</typeMatches>

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が1つのテンプレートで1行テキスト フィールド タイプとして定義され、別のテンプレートでドロップリスト フィールド タイプとして定義されている場合に特に問題になります。

  2. Solrは、SitecoreがSolr textフィールド タイプにマッピングするsingle-line textフィールド タイプをAddFieldByFieldTypeNameセクションで返します。

    <fieldTypes hint="raw:AddFieldByFieldTypeName">
      <fieldType
        fieldTypeName="html|rich text|single-line text|multi-line text|text|memo|image" 
        returnType="text"
      />
    </fieldTypes>
  3. Sitecoreは、Solr textフィールド タイプをAddTypeMatchセクションの {0}_tフィールド名形式にマッピングします。

    <typeMatches hint="raw:AddTypeMatch">
      <typeMatch
        typeName="text"
        type="System.String"
        fieldNameFormat="{0}_t"
        cultureFormat="_{1}"
        settingType="Sitecore.ContentSearch.SolrProvider.SolrSearchFieldConfiguration,
          Sitecore.ContentSearch.SolrProvider"
      />
    </typeMatches>
  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サブツリーは含まれません):

    <crawler
      type="Sitecore.ContentSearch.SitecoreItemCrawler,
        Sitecore.ContentSearch">
      <Database>master</Database>
      <Root>/sitecore/content</Root>
    </crawler>
  • インデックス ドキュメント オプションは、テンプレート フィールド アイテムを除外するように設定されています。

    <exclude hint="list:AddExcludedTemplate">
      <TemplateField>{455A3E98-A627-4B40-8035-E683A0331AC7}</TemplateField>
    </exclude>

構成で必要な場合は、TemplateIndexNameタグを追加して、テンプレートがインデックス化されるようにします。タグは、クローラが /sitecore/templatesルートの下にあるすべてのテンプレートフィールド項目をインデックス化するインデックスを指す必要があります。

<index
  id="sitecore_master_index"
  type="Sitecore.ContentSearch.SolrProvider.SolrSearchIndex, 
    Sitecore.ContentSearch.SolrProvider">
  ...
  <TemplateIndexName>TEMPLATE INDEX NAME</TemplateIndexName>
</index>

TemplateIndexNameを指定すると、Sitecore Content Searchは、Solrへのクエリで使用されるSitecoreフィールドのSolrマッピングを正しく解決できます。テンプレートのインデックス作成に失敗すると、検索要求が失敗したり、検索結果が空になったりする可能性があります。

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