---
title: "Solrフィールド名解決の利用"
slug: "using-solr-field-name-resolution"
abstract: "Sitecoreが文書(アイテム)フィールド名をSolrフィールド名に自動マッピングする方法の概要。"
---
# Solrフィールド名解決の利用

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

残念ながら、大量のSitecoreフィールドをSolrフィールドに手動でマッチングするのは実用的ではありません。しかし、[Solr動的フィールド](https://cwiki.apache.org/confluence/display/solr/Dynamic+Fields) を使って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型フィールドに写します。
    
    <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としてインデックス付けします。
    

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

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

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

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としてインデックス付けします。

<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\`1System.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フィールド名で解決できない場合は、CLR型を使って設定AddTypeMatchと照合します。この例では、CasablancaのCLR型が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ランタイムタイプにフィールドタイプ名をマッピングできる場合、Sitecoreテンプレートリゾルバを使ってSolrにテンプレートとフィールドタイプを問い合わせます。

例えば、Sitecore airportプロパティはAddTypeMatchセクションのstringとtext .NETのランタイム型の両方にマッピングするSystem.String型です。これにより、2つのフィールド名フォーマット({0}\_sと{0}\_t)と2つのSolr動的フィールド名(airport\_sとairport\_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が一つのテンプレートでシングルラインテキストフィールドタイプ、別のテンプレートでドロップリストフィールドタイプとして定義されている場合に深刻です。
    
2.  SolrはSitecoreAddFieldByFieldTypeNameセクションのSolr textフィールドタイプに対応するsingle-line textフィールドタイプを返します。
    
    <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マッピングを正しく解決できます。テンプレートのインデックス化失敗は、検索リクエストの失敗や検索結果の空白を引き起こすことがあります。