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

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

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

Solrを検索プロバイダーとして使用する場合は、Solrに保存されたドキュメントの格納とクエリに関するいくつかの規則に従う必要があります。Sitecoreがインデックス作成のためにドキュメント (Sitecoreアイテム) をSolrに送信する場合、ドキュメントは特定の形式である必要があります。

  • ドキュメント内の各インデックス・フィールドは、事前定義されたSolrフィールドである必要があります。

    たとえば、SitecoreからのItem NameはSolrドキュメントの _nameにマッピングされます。 _nameインデックス・フィールドを保管する前に、Solrスキーマでインデックス・フィールドを定義する必要があります。

  • または、Sitecoreドキュメントの各インデックス フィールドを、事前定義された動的Solrフィールドのサフィックスと一致させることもできます。

    たとえば、SitecoreのCreated Byフィールドは、*_s動的フィールドと一致するため、Solrドキュメントでparsedcreatedby_sとしてマッピングされます。*_s動的索引フィールドを保管する前に、Solrスキーマで動的索引フィールドを定義する必要があります。

いつでも多数のSitecoreアイテム フィールドを追加できるため、すべてのSitecoreアイテム フィールドに対して新しいSolrインデックス フィールドをSolrスキーマに追加することは、不可能ではないにしても実用的ではありません。

この問題を回避するには、動的フィールドのSolr機能を使用して 、インデックス付きフィールドのグローバル マッピング ルールを設定します。これは、Sitecoreアイテム フィールドと計算されたインデックス フィールドで機能します。

マッピングはSitecore.ContentSearch.Solr.DefaultIndexConfiguration.configファイルで指定します。

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

Sitecoreフィールド タイプを動的フィールド タイプにマッピングするには、設定ファイルのAddFieldByFieldTypeNameセクションとAddTypeMatchセクションで行います。

たとえば、SitecoreアイテムAtemplateAが使用され、field1が数値フィールドである場合、field1はこの設定によってfield1_tfとしてインデックス化されます。

<fieldType fieldTypeName="number" returnType="float" />
<typeMatch typeName="float" type="System.Single"  fieldNameFormat="{0}_tf" settingType="Sitecore.ContentSearch.SolrProvider.SolrSearchFieldConfiguration, Sitecore.ContentSearch.SolrProvider" /> 

Sitecoreの計算フィールドを動的フィールド タイプにマッピングするには、設定ファイルのAddComputedIndexFieldセクションとAddTypeMatchセクションで行います。

たとえば、calculateddimension計算フィールドにインデックスを付けるにはcalculateddimension_sm

<field fieldName="calculateddimension" returnType="stringCollection">Sitecore.ContentSearch.ComputedFields.CalculatedDimension,Sitecore.ContentSearch</field>
<typeMatch typeName="stringCollection" type="System.Collections.Generic.List`1[System.String]" fieldNameFormat="{0}_sm" multiValued="true" settingType="Sitecore.ContentSearch.SolrProvider.SolrSearchFieldConfiguration, Sitecore.ContentSearch.SolrProvider" />

AddFieldByFieldTypeNameセクションの設定は、AddFieldByFieldNameセクションのフィールドごとに上書きできます。

たとえば、titleフィールドには次のようにインデックスが付けられtitle_t

<field fieldName="title" returnType="text" />
<typeMatch typeName="text" type="System.String" fieldNameFormat="{0}_t" cultureFormat="_{1}" settingType="Sitecore.ContentSearch.SolrProvider.SolrSearchFieldConfiguration, Sitecore.ContentSearch.SolrProvider" />

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

Solrインデックス・フィールドの名前は、検索時とインデックス作成時とほぼ同じ方法で解決されます。

ただし、フィールドの種類と値のの種類に関する情報が欠落しているため、わずかな違いがあります。たとえば、title:homeを検索すると、Sitecoreはtitleフィールドのタイプも、titleのタイプ (文字列、数値など) も認識しません。

したがって、Sitecore Solrフィールド解決は、タイトル フィールドのフィールド タイプを内部で見つけて解決します。この情報は、Solrインデックスを検索するときに使用するフィールド名の形式を決定するために使用されます。

たとえば、ユーザーがtitle:z1000を含むクエリでアイテム バケットを検索すると、Sitecoreはtitleフィールドを持つテンプレートを見つけます。

ここでは、テンプレートはSample Itemで、フィールド タイプはtitle 1行テキストです。これはtypeMatch構成と照合され、検索用のSolrインデックス フィールドとしてtitle_tが得られるため、Solrクエリは /select?q=title_t:z1000になります。

設定は次のとおりです。

<fieldType fieldTypeName="html|rich text|single-line text|multi-line text|text|memo|image|reference" returnType="text" />
<typeMatch typeName="text" type="System.String" fieldNameFormat="{0}_t" cultureFormat="_{1}" settingType="Sitecore.ContentSearch.SolrProvider.SolrSearchFieldConfiguration, Sitecore.ContentSearch.SolrProvider" />

Sitecore LINQクエリを使用することもできます。

var queryable = index.CreateSearchContext().GetQueryable< CustomSearchResultItem >();
var q = queryable.Where(i => i.Field1.Equals("search term")).ToList();
public class CustomSearchResultItem : SearchResultItem
    {
 [IndexField("Field1")]
        [DataMember]
        public virtual string Field1
        {
            get;
            set;
     }
}

Sitecore LINQクエリを使用して検索し、厳密に型指定されたプロパティがある場合、Solrクエリの構築時にプロパティのランタイム タイプを使用して設定が解決されます。

ただし、AddTypeMatchセクションに複数の .Netランタイム タイプが見つかった場合、SitecoreはSolrをクエリしてフィールドのフィールド タイプを見つけるためにもう1つの手順を実行します。Sitecoreは、このために内部的にテンプレート リゾルバーを使用します。テンプレート・リゾルバーは、次のようにクエリーを作成し、Solrに送信してテンプレートを見つけます。

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

上記の例では、field1プロパティのタイプはstringです。stringにはAddTypeMatchつの設定があります。ただし、Sitecoreはテンプレート リゾルバーがフィールド タイプSingle-Line Textを返すため、fieldNameFormat {0}_tを含む設定を選択します。AddFieldByFieldTypeNameセクションで定義されている1行テキスト設定は、AddTypeMatchセクションのtextと一致します。したがって、フィールド名はfield1_tとして解決されます。

最終的なSolrクエリは /select?q=_field1_t:”search term”&fq=_indexname:(sitecore_master_index)です。

<fieldType fieldTypeName="html|rich text|single-line text|multi-line text|text|memo|image" returnType="text" />

最後に、次の例は、Sitecore LINQクエリを使用してインデクサーで用語を検索する方法を示しています。

<typeMatch typeName="text" type="System.String" fieldNameFormat="{0}_t" cultureFormat="_{1}" settingType="Sitecore.ContentSearch.SolrProvider.SolrSearchFieldConfiguration, Sitecore.ContentSearch.SolrProvider" />
var queryable = index.CreateSearchContext().GetQueryable< SearchResultItem >();
var q = queryable.Where(i => i["field1"] == "search term").ToList();

Sitecore LINQクエリで用語を検索し、インデクサーでフィルタリングすると、動作と解像度は前述のものと同じです。マッピングするランタイム タイプがないため、Sitecoreはタイトル フィールドを持つテンプレートを検索し、フィールド タイプを見つけます。Sitecoreは、これにテンプレート リゾルバーを使用します。最後に、Sitecoreは、前述のように、フィールド タイプを使用して設定を解決します。

たとえば、field1が1行テキスト フィールドの場合、次のクエリでは /select?q=_field1_t:”search term”&fq=_indexname:(sitecore_master_index)が生成されます。

queryable.Where(i => i["field1"] == "search term").ToList();
<typeMatch typeName = "text" type = "System.String" fieldNameFormat = "{0}_t" cultureFormat = "_{1}" settingType = "Sitecore.ContentSearch.SolrProvider.SolrSearchFieldConfiguration, Sitecore.ContentSearch.SolrProvider" / >
<fieldType fieldTypeName = "html|rich text|single-line text|multi-line text|text|memo|image|reference" returnType = "text" / >
メモ

Sitecoreは必須フィールドを含むテンプレートを検索し、適切に解決します。テンプレートにインデックスを付けないと、Sitecoreは動的フィールドを解決できません。この問題を解決するには、インデックスを作成するコンテンツをカバーするクローラーと、/sitecore/Templatesのテンプレートをカバーするクローラーの2つを用意します。

Sitecore Solrの検索制限

Sitecoreインデックスの解像度が一貫した結果をもたらすことを保証できない状況があります。

たとえば、field1フィールドが複数のテンプレートで定義されている場合、以下に示すクエリでは一貫性のない結果が生じる可能性があります。これは、field1が1つのテンプレートで1行テキスト、別のテンプレートでドロップリストというフィールドタイプとして定義されている場合に特に当てはまります。

var queryable = index.CreateSearchContext().GetQueryable < CustomSearchResultItem > ();
var q = queryable.Where(i => i.Field1.Equals("search term")).ToList();
public class CustomSearchResultItem: SearchResultItem {
    [IndexField("Field1")]
    [DataMember]
    public virtual string Field1 {
        get;
        set;
    }
}

より完全な説明は、field1フィールドがCustomSearchResultItemPOCOクラスでstringとして定義されていることです。さらに、どちらのフィールド タイプもAddTypeMatchセクションでtextstringtypeMatchに解決されますが、どちらの設定もランタイム タイプSystem.String。したがって、どの構成を選択するかについてはあいまいさがあります。  

次の例では、一貫性のない結果が生成される可能性もあります。

var queryable = index.CreateSearchContext().GetQueryable< SearchResultItem >();
var q = queryable.Where(i => i["field1"] == "search term").ToList();

field1が1つのテンプレートで数値フィールドとして定義され、別のテンプレートで1行テキストとして定義されている場合、テンプレート リゾルバーは両方のテンプレートに対して2つの結果を返します。Sitecoreはテンプレート リゾルバーが返す最初の結果を選択しますが、結果の順序は予測できません。

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