---
title: "検索クエリフィールドマッピングの設定"
slug: "set-up-search-query-field-mapping"
abstract: "未定"
---
# 検索クエリフィールドマッピングの設定

Experience Edge(プレビュー)スキーマ上でGraphQL検索クエリで正確なフレーズマッチングが必要な場合は、SearchQueryFieldMapping機能を使ってトークン化されたフィールドを非トークン化された計算フィールドにマッピングします。この変換はクエリ構築コード内で、クエリがSolr検索プロバイダーに送られる前に内部的に行われます。

デフォルトでは、Solrインデックスのテキストフィールドはトークン化されており、空白と句読点を使ってテキストを個別の用語に分割します。例えば*、「New Site」*は*「new」*と*「site」*は別々に変わります。これは一般的なテキスト検索では機能しますが、正確なフレーズマッチングを破ります。EQオペレーターで\_name == "Site"の検索クエリはCONTAINSのように振る舞い、複数の結果を返します。

これを解決するために、lowercaseStringのようなフィールドタイプを使ってトークン化されていないフィールド(例えば\_customName)を作成し、完全な値を単一のトークンとして保持し、検索操作中に元の\_nameフィールドをそれにマッピングできます。これにより、後方互換性を維持しつつ正確なマッチングが可能になります。

> !注**始める前に**以下を必ず確認してください:
> 
> -   Sitecore Experience Platform(XP)環境へのアクセス。
>     
> -   XPの設定ファイルや展開プロセスに精通していること。
>     

## 検索クエリフィールドマッピングの設定

以下の例は、\_nameフィールドを\_customName計算されたフィールドにマッピングすることで検索クエリフィールドマッピングを設定する方法を示しています。計算フィールドの作成に関する完全な手順については、「 [計算インデックスフィールドの作成](https://doc.sitecore.com/xp/ja/developers/101/platform-administration-and-architecture/create-a-computed-index-field.html "Create a computed index field")」を参照してください。

SearchQueryFieldMapping機能を設定するには:

1.  **新しい計算インデックスフィールドを作成する**
    
    既存の実装Sitecore.Services.GraphQL.EdgeSchema.ComputedFields.CustomNameComputedFieldを使って新しい計算フィールドを作成します。
    
    設定ファイルのcontentSearchセクションのAddComputedIndexFieldノードに新しいフィールドを追加してください。
    
    この例では、lowercaseString型を用いて\_customNameフィールドを作成します。
    
    <configuration xmlns:patch="http://www.sitecore.net/xmlconfig/" xmlns:role="http://www.sitecore.net/xmlconfig/role/">
     <sitecore>
     <contentSearch>
     <indexConfigurations>
     <defaultSolrIndexConfiguration>
     <documentOptions type="Sitecore.ContentSearch.SolrProvider.SolrDocumentBuilderOptions,
     Sitecore.ContentSearch.SolrProvider">
     <fields hint="raw:AddComputedIndexField">
     <!-- Create a non-tokenized version of the \_name field -->
     <field fieldName="\_customName"
     returnType="lowercaseString"
     type="Sitecore.Services.GraphQL.EdgeSchema.ComputedFields.CustomNameComputedField,
     Sitecore.Services.GraphQL.EdgeSchema" />
     </fields>
     </documentOptions>
     </defaultSolrIndexConfiguration>
     </indexConfigurations>
     </contentSearch>
     </sitecore>
    </configuration>
    
2.  **検索フィールド名を計算されたフィールドにマッピングします**
    
    フィールドマッピングを設定するには、setFieldMappingノードにフィールド名マッピングモデルを追加してください。このモデルは検索クエリフィールドをマッピングする際にSearchQueryFieldMappingServiceによって処理されます。
    
    fieldMappingModelでは、\_name体を\_customName体に写します。
    
    <configuration xmlns:patch="http://www.sitecore.net/xmlconfig/" xmlns:role="http://www.sitecore.net/xmlconfig/role/">
     <sitecore>
     <api>
     <GraphQL>
     <setFieldMapping
     type="Sitecore.Services.GraphQL.EdgeSchema.Services.SearchQueryFieldMapping.FieldMapping,
     Sitecore.Services.GraphQL.EdgeSchema">
     <fieldMapping hint="list:AddFieldMapping">
     <!-- Map the original \_name field to the non-tokenized \_customName field -->
     <fieldMappingModel
     fieldName="\_name"
     type="Sitecore.Services.GraphQL.EdgeSchema.Services.SearchQueryFieldMapping.FieldMappingModel,
     Sitecore.Services.GraphQL.EdgeSchema">
     <fieldName>\_name</fieldName>
     <mappingField>\_customName</mappingField>
     </fieldMappingModel>
     </fieldMapping>
     </setFieldMapping>
     </GraphQL>
     </api>
     </sitecore>
    </configuration>
    
3.  **パッチを含めてSitecoreにデプロイしてください**
    
    ステップ1と2の設定パッチをプロジェクトにコミットし、標準的なデプロイプロセスでXP環境を展開します。
    
4.  **インデックスの再構築**
    
    展開後、すべての変更を加えた後に検索インデックスを再構築してください。インデックスの再構築が完了すると、フィールドマッピングは有効で使用可能になります。
    

## クエリの検索クエリフィールドマッピングをクエリで活用してください

設定後、Edge(プレビュー)スキーマの場合、GraphQL検索クエリで元のフィールド名 (\_name) を使用すると、マッピングは自動的にクエリをSolrインデックス内の非トークン化フィールド(\_customName)にリダイレクトします。これにより、コード内で元のフィールド名を使い続けつつ、完全マッチングの恩恵を受けられます。

### 例:完全一致クエリ

\_nameフィールドのEQ演算子を使うと、検索結果は正確な値に一致するアイテムを返します。このクエリは「Sitecore Experience」を検索し、各一致する項目のidおよびnameフィールドを要求します。

query Search {
 search(
 where: {
 name: "\_name"
 value: "Sitecore Experience"
 operator: EQ
 }
 ) {
 results {
 id
 name
 }
 }
}

フィールドマッピングがなければ、この同じクエリは任意のトークン化された用語を含む複数の結果を返します。\_customNameへのマッピングでは、名前が「Sitecore Experience」と正確に一致する項目のみを返します。

### 例:クエリを包含

CONTAINSオペレーターは、フィールドマッピングに関係なく検索語を含むアイテムを返します。このクエリは「Sitecore」を含むアイテムを検索し、idとnameフィールドを要求します。

query Search {
 search(
 where: {
 name: "\_name"
 value: "Sitecore"
 operator: CONTAINS
 }
 ) {
 results {
 id
 name
 }
 }
}

> !注フィールドマッピングを設定する際には、以下の点を考慮してください。
> 
> -   元のフィールド名(\_name)は、マッピングが設定された後もクエリで使用可能です。
>     
> -   フィールドマッピングはプレビューエンドポイントにのみ適用されます。
>     
> -   複数のフィールドを異なる非トークン化バージョンにマッピングできます。
>     
> -   カスタムフィールド名は、計算されたフィールド定義とフィールドマッピングの設定との間で一貫性を持つ必要があります。
>