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

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

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

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

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

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

!注始める前に以下を必ず確認してください:

  • Sitecore Experience Platform(XP)環境へのアクセス。

  • XPの設定ファイルや展開プロセスに精通していること。

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

以下の例は、_nameフィールドを_customName計算されたフィールドにマッピングすることで検索クエリフィールドマッピングを設定する方法を示しています。計算フィールドの作成に関する完全な手順については、「 計算インデックスフィールドの作成」を参照してください。

SearchQueryFieldMapping機能を設定するには:

  1. 新しい計算インデックスフィールドを作成する

    既存の実装Sitecore.Services.GraphQL.EdgeSchema.ComputedFields.CustomNameComputedFieldを使って新しい計算フィールドを作成します。

    設定ファイルのcontentSearchセクションのAddComputedIndexFieldノードに新しいフィールドを追加してください。

    この例では、lowercaseString型を用いて_customNameフィールドを作成します。

  2. 検索フィールド名を計算されたフィールドにマッピングします

    フィールドマッピングを設定するには、setFieldMappingノードにフィールド名マッピングモデルを追加してください。このモデルは検索クエリフィールドをマッピングする際にSearchQueryFieldMappingServiceによって処理されます。

    fieldMappingModelでは、_name体を_customName体に写します。

    \_name \_customName
  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)は、マッピングが設定された後もクエリで使用可能です。

  • フィールドマッピングはプレビューエンドポイントにのみ適用されます。

  • 複数のフィールドを異なる非トークン化バージョンにマッピングできます。

  • カスタムフィールド名は、計算されたフィールド定義とフィールドマッピングの設定との間で一貫性を持つ必要があります。

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