Azure Cognitive Search でのシノニム

検索サービス内において、シノニム マップは同等の用語を関連付けるグローバル リソースです。ユーザーが実際に用語を提供する必要がなく、クエリのスコープが拡張されます。 たとえば、"dog"、"canine"、"puppy" がマップされたシノニムであると仮定すると、"canine" に対するクエリは "dog" を含むドキュメントで一致します。

シノニムを作成する

シノニム マップは、一度作成すると多数のインデックスで使用できるアセットです。 サービス レベルによって、作成できるシノニム マップの数が決定されます。これは、Free および Basic レベルでの 3 つのシノニム マップから、Standard レベルでの 20 までの範囲です。

英語版やフランス語版など、言語によって別々のシノニム マップを複数作成したり、コンテンツに技術用語やあいまいな用語が含まれている場合は、辞書を作成したりすることができます。 検索サービスで複数のシノニム マップを作成できますが、フィールドではそのうちの 1 つしか使用できません。

シノニム マップは、シノニム マップ エントリとして機能する名前、形式、および規則で構成されます。 サポートされている形式は solr のみで、solr 形式によってルールの構成が決まります。

POST /synonymmaps?api-version=2020-06-30
{
    "name": "geo-synonyms",
    "format": "solr",
    "synonyms": "
        USA, United States, United States of America\n
        Washington, Wash., WA => WA\n"
}

シノニム マップはプログラムを使用して作成します (ポータルではシノニム マップ定義がサポートされていません)。

ルールを定義する

マッピング規則は、このドキュメントで説明している Apache Solr のオープンソース シノニム フィルター仕様SynonymFilter に従います。solr 形式では、次の 2 種類の規則がサポートされています。

  • 同義性 (用語はクエリで同等の代用語になります)

  • 明示的なマッピング (クエリ実行の前に、用語は 1 つの明示的な用語にマップされます)

各規則は、改行文字 (\n) で区切る必要があります。 無料サービスでシノニム マップあたり最大 5,000 個の規則、その他のレベルでマップあたり最大 20,000 個の規則を定義できます。 各規則には、最大 20 個の拡張 (つまり規則内の項目) を設定できます。 詳細については、「シノニムの制限」をご覧ください。

クエリ パーサーでは大文字の用語や大文字と小文字が混在した用語は小文字に変換されますが、コンマやダッシュなどの特殊文字を文字列で保持する場合は、シノニム マップの作成時に適切なエスケープ文字を追加します。

同義性規則

同義語の規則は、同じ規則内でコンマで区切られます。 最初の例では、USA に対するクエリが USA"United States"、または "United States of America" に拡張されます。 句で一致させる場合は、クエリ自体を引用符で囲まれた句のクエリにする必要があることに注意してください。

同義性の場合、dog のクエリは、puppycanine も含めるようにクエリを拡張します。

{
"format": "solr",
"synonyms": "
    USA, United States, United States of America\n
    dog, puppy, canine\n
    coffee, latte, cup of joe, java\n"
}

明示的なマッピング

明示的なマッピングの規則は、矢印 => によって示されます。 指定した場合、=> の左側に一致する検索クエリの用語のシーケンスが、クエリ時に右側の代替語で置き換えられます。

明示的な場合、WashingtonWash.、または WA に対するクエリは WA に書き換えられ、クエリ エンジンは WA の用語でのみ一致を検索します。 明示的なマッピングは指定した方向でのみ適用され、この例では、クエリ WAWashington に書き換えられることはありません。

{
"format": "solr",
"synonyms": "
    Washington, Wash., WA => WA\n
    California, Calif., CA => CA\n"
}

特殊文字のエスケープ

フルテキスト検索では、他のクエリ用語と同様に、シノニムがクエリ処理の際に分析されます。つまり、予約文字と特殊文字に関する規則がシノニム マップ内の用語に適用されます。 エスケープが必要な文字の一覧は、単純な構文と完全な構文で異なります。

インデックス作成時に既定のアナライザーによって破棄される可能性のある文字を保持する必要がある場合は、それらの文字を保持するアナライザーに置き換える必要があることに注意してください。 選択肢には、ハイフンでつながれた単語を保持する Microsoft 自然言語アナライザーや、より複雑なパターン用のカスタム アナライザーなどが含まれます。 詳細については、部分的な語句、パターン、特殊文字に関する記事を参照してください。

円記号を使用して文字をエスケープする方法の例を次に示します。

{
"format": "solr",
"synonyms": "WA\, USA, WA, Washington\n"
}

JSON や C# などの他の言語では、円記号自体が特殊文字であるため、通常、二重にエスケープする必要があります。 たとえば、上記のシノニム マップに対して REST API に送信される JSON は、次のようになります。

{
"format":"solr",
"synonyms": "WA\\, USA, WA, Washington"
}

シノニム マップをアップロードして管理する

前述のように、クエリおよびインデックス作成ワークロードを中断せずにシノニム マップを作成または更新することができます。 シノニム マップはスタンドアロン オブジェクト (インデックスやデータ ソースなど) であり、これを使用しているフィールドがない限り、更新によってインデックス作成やクエリが失敗することはありません。 ただし、シノニム マップをフィールド定義に追加した後でシノニム マップを削除すると、該当するフィールドを含むクエリが 404 エラーで失敗します。

シノニム マップの作成、更新、および削除は、常にドキュメント全体の操作になります。つまり、シノニム マップの一部を段階的に更新または削除することはできません。 1 つの規則の更新でも、再読み込みが必要になります。

フィールドにシノニムを割り当てる

シノニム マップをアップロードした後、"searchable":true を含むフィールドで Edm.String または Collection(Edm.String) 型のフィールドに対してシノニムを有効にすることができます。 前述のように、フィールド定義で使用できるシノニム マップは 1 つだけです。

POST /indexes?api-version=2020-06-30
{
    "name":"hotels-sample-index",
    "fields":[
        {
            "name":"description",
            "type":"Edm.String",
            "searchable":true,
            "synonymMaps":[
            "en-synonyms"
            ]
        },
        {
            "name":"description_fr",
            "type":"Edm.String",
            "searchable":true,
            "analyzer":"fr.microsoft",
            "synonymMaps":[
            "fr-synonyms"
            ]
        }
    ]
}

同義またはマップされたフィールドに対するクエリ

シノニムを追加しても、新しい要件はクエリ構造に適用されません。 シノニムの追加前と同じようにして、用語と語句のクエリを発行できます。 唯一の違いは、シノニム マップにクエリ用語が存在する場合、クエリ エンジンは規則に応じて、用語または句を拡張したり、書き換えたりするという点です。

クエリの実行中にシノニムが使用される方法

シノニムは、インデックスの内容を同等の用語で補完するクエリ拡張の手法ですが、シノニムの割り当てがあるフィールドでのみ機能します。 フィールド スコープ クエリでシノニム対応フィールドが除外されている場合、シノニム マップからの一致は表示されません。

シノニム対応フィールドの場合、シノニムは、関連付けられているフィールドと同じテキスト分析に従います。 たとえば、フィールドが標準の Lucene アナライザーを使用して分析される場合は、シノニム用語もクエリ時に標準の Lucene アナライザーに従います。 シノニム用語に句読点 (ピリオドやダッシュなど) を保持したい場合は、フィールドでコンテンツ保持アナライザーを適用します。

内部的には、シノニム機能により、シノニムを含む元のクエリが OR 演算子で書き換えられます。 このため、検索結果の強調表示とスコアリング プロファイルは元の用語とシノニムを同等として処理します。

シノニムは自由形式のテキスト クエリにのみ適用され、フィルター、ファセット、オートコンプリート、または提案ではサポートされません。 オートコンプリートと提案は、元の用語にのみ基づき、シノニムの一致は応答に示されません。

シノニムの拡張は、ワイルドカード検索語句には適用されません。プレフィックス、あいまい検索、および正規表現語句は拡張されません。

シノニムの拡張とワイルドカード検索、正規表現検索、またはあいまい検索を 1 つのクエリで適用する必要がある場合は、OR 構文を使用してクエリを組み合わせることができます。 たとえば、クエリ構文が単純になるようにシノニムとワイルドカードを組み合わせる場合は、用語は <query> | <query>* のようになります。

開発 (非運用) 環境に既存のインデックスがある場合は、小さな辞書で実験して、シノニムの追加によって、スコアリング プロファイル、検索結果の強調表示、検索候補への影響など、検索操作がどのように変わるかを確認します。

次のステップ