クエリでオートコンプリートと一致候補の suggester を構成する

Azure AI Search では、suggester を使用して typeahead (autocomplete) または "search-as-you-type" が有効になります。 suggester は、オートコンプリートと候補を設定するために使用するフィールドを指定するインデックスの構成です。 これらのフィールドでは、余分なトークン化が行われます。これにより、部分的な用語での一致をサポートするプレフィックス シーケンスが生成されます。 たとえば、"Seattle" の値を持つ City フィールドを含む suggester のプレフィックスの組み合わせは、先行入力をサポートする "sea"、"seat"、"seatt"、"seattl" になります。

部分的用語での一致は、オートコンプリート クエリと一致候補のいずれかです。 同じ suggester は、両方のエクスペリエンスをサポートします。

先行入力は、用語全体のクエリの一部入力を補完する "オートコンプリート" と、特定の一致へのクリック スルーを促す "検索候補" です。 オートコンプリートでは、クエリが生成されます。 候補では、一致するドキュメントが生成されます。

次のスクリーンショットは、両方を示しています。 オートコンプリートを使用すると、可能性のある語句が予測され、"tw" に "in" が補完されます。 候補はミニ検索結果であり、ホテル名のようなフィールドには、インデックスから一致するホテルの検索ドキュメントが表示されます。 候補については、説明的な情報を提供する任意のフィールドを表示できます。

Visual comparison of autocomplete and suggested queries

これらの機能は、個別に、または組み合わせて使用できます。 Azure AI Search でこれらの動作を実装するには、インデックスとクエリのコンポーネントがあります。

  • 検索インデックスの定義に suggester を追加します。 この記事の残りの部分では、suggester の作成に焦点を絞って説明します。

  • 後のセクションに記載されている API のいずれかを使用して、Suggester 対応クエリを Suggestion 要求またはオートコンプリート要求の 形式で呼び出します

型指定検索は、文字列フィールドに対してフィールドごとに有効になります。 スクリーンショットに示したものと同様のエクスペリエンスを求めているのであれば、同じ検索ソリューション内に両方の先行入力の動作を実装できます。 どちらの要求も特定のインデックスのドキュメント コレクションを対象としており、ユーザーが少なくとも 3 文字の入力文字列を指定した後に応答が返されます。

suggester を作成する方法

suggester を作成するには、それをインデックス定義に追加します。 suggester によって、先行入力エクスペリエンスが有効になっているフィールドの名前とコレクションが取得されます。 suggester を作成する最適なタイミングは、それを使用するフィールドも定義する場合です。

  • 文字列フィールドのみを使用します。

  • 文字列フィールドが複合型 (Address 内にある City フィールドなど) の一部である場合は、フィールド パスに親を含めます。"Address/City" (REST、および C# と Python)、または ["Address"]["City"] (JavaScript)。

  • フィールドで、既定の標準 Lucene アナライザー ("analyzer": null) または 言語アナライザー ("analyzer": "en.Microsoft" など) を使用します。

既存のフィールドを使用して suggester を作成しようとすると、API によって禁止されます。 プレフィックスは、インデックス作成の間に、2 つ以上の文字の組み合わせから成る部分的な用語が完全な用語と並行してトークン化されるときに生成されます。 既存のフィールドが既にトークン化されているため、suggester に追加する場合は、インデックスを再構築する必要があります。 詳細については、「Azure AI Search インデックスを再構築する方法」を参照してください。

フィールドの選択

suggester は、いくつかのプロパティを備えていますが、基本的には、search-as-you-type エクスペリエンスを有効にしている文字列フィールドのコレクションです。 インデックスごとに 1 つの suggester があるため、suggester リストには、候補とオートコンプリートの両方のコンテンツを提供するすべてのフィールドを含める必要があります。

オートコンプリートは、余分なコンテンツの用語補完の可能性が高いため、描画元となるフィールドのプールが大きいため、メリットがあります。

一方、候補では、フィールド選択が選択的である場合により良い結果が得られます。 検索候補は検索ドキュメントのプロキシであるため、1 つの結果を最も適切に表すフィールドを選択してください。 複数の一致を区別する名前、タイトル、またはその他の固有のフィールドが最適です。 フィールドが繰り返し値で構成されている場合、提案は同じ結果で構成され、ユーザーはどれを選択するかを知りません。

入力時の検索エクスペリエンスの両方を満たすために、オートコンプリートに必要なすべてのフィールドを追加し、検索selecttopfiltersearchFields候補の結果を制御します。

アナライザーの選択

アナライザーを選択すると、フィールドのトークン化とプレフィックスの付き方が決まります。 たとえば、"context-sensitive" のようなハイフネーションされた文字列の場合、言語アナライザーを使用すると、"context"、"sensitive"、"context-sensitive" というトークンの組み合わせが生成されます。 ここでは標準の Lucene アナライザーを使用したので、ハイフンでつながれた文字列は存在しません。

アナライザーを評価するときは、テキスト分析 API を使用して、用語の処理方法を把握することを検討してください。 インデックスを作成したら、文字列に対してさまざまなアナライザーを試して、トークン出力を確認することができます。

カスタム アナライザーまたは組み込みアナライザー (標準 Lucene を除く) を使用するフィールドは、不適切な結果を防ぐために明示的に許可されていません。

Note

アナライザーの制約を回避する必要がある場合 (たとえば、特定のクエリ シナリオのためにキーワードまたは ngram アナライザーが必要な場合)、同じコンテンツに対して 2 つの別個のフィールドを使用する必要があります。 これにより、一方のフィールドで suggester を指定し、他方をカスタム アナライザーの構成で設定することができます。

ポータルを使用して作成する

インデックスの追加またはデータ インポートウィザードを使用してインデックスを作成する場合は、suggester を有効にするオプションがあります。

  1. インデックスの定義で、suggester の名前を入力します。

  2. 新しいフィールドの各フィールド定義で、[Suggester] 列のチェックボックスをオンにします。 チェックボックスは、文字列フィールドでのみ使用できます。

前述のように、アナライザーの選択はトークン化とプレフィックス付けに影響します。 suggester を有効にする場合は、フィールド定義全体を考慮してください。

REST を使用して作成する

REST API では、インデックス作成またはインデックス更新を使用して suggester を追加します。

{
  "name": "hotels-sample-index",
  "fields": [
    . . .
        {
            "name": "HotelName",
            "type": "Edm.String",
            "facetable": false,
            "filterable": false,
            "key": false,
            "retrievable": true,
            "searchable": true,
            "sortable": false,
            "analyzer": "en.microsoft",
            "indexAnalyzer": null,
            "searchAnalyzer": null,
            "synonymMaps": [],
            "fields": []
        },
  ],
  "suggesters": [
    {
      "name": "sg",
      "searchMode": "analyzingInfixMatching",
      "sourceFields": ["HotelName"]
    }
  ],
  "scoringProfiles": [
    . . .
  ]
}

.NET を使用して作成する

C# で、SearchSuggester オブジェクトを定義します。 Suggesters は SearchIndex オブジェクトのコレクションですが、1 つのアイテムのみを受け取ることができます。 インデックスの定義に suggester を追加します。

private static void CreateIndex(string indexName, SearchIndexClient indexClient)
{
    FieldBuilder fieldBuilder = new FieldBuilder();
    var searchFields = fieldBuilder.Build(typeof(Hotel));

    var definition = new SearchIndex(indexName, searchFields);

    var suggester = new SearchSuggester("sg", new[] { "HotelName", "Category", "Address/City", "Address/StateProvince" });
    definition.Suggesters.Add(suggester);

    indexClient.CreateOrUpdateIndex(definition);
}

プロパティ リファレンス

プロパティ 内容
name suggester の定義に指定しますが、オートコンプリートまたは候補の要求でも呼び出されます。
sourceFields suggester 定義で指定します。 候補の内容のソースであるインデックスの 1 つまたは複数のフィールドのリストです。 フィールドは Edm.String 型である必要があります。 フィールドにアナライザーが指定されている場合は、(カスタム アナライザーではなく) こちらの一覧の名前付き語彙アナライザーである必要があります。

ベスト プラクティスとしては、検索バーまたはドロップダウン リストのどちらの補完された文字列でも、想定される適切な応答に利用するフィールドのみを指定します。

ホテル名は正確なため、適切な選択肢です。 説明やコメントなどの詳細なフィールドは、文字数が多くなりすぎます。 同様に、カテゴリやタグなどの反復的なフィールドでは、効果が低くなります。 例には、複数のフィールドを含めることができることを例示するために、ひとまず、"カテゴリ" を組み入れています。
searchMode REST のみのパラメーターですが、ポータルにも表示されます。 このパラメーターは .NET SDK では使用できません。 候補語句の検索に使用される戦略を示します。 現在サポートされているモードは analyzingInfixMatching のみです。これは、現在、用語の先頭でマッチングを実行します。

suggester を使用する

クエリには suggester が使用されています。 suggester を作成したら、search-as-you-type エクスペリエンス用の次の API のいずれかを呼び出します。

検索アプリケーションでは、クライアント コードで、jQuery UI オートコンプリート などのライブラリを利用して、部分クエリを収集し、一致を提供する必要があります。 このタスクの詳細については、クライアント コードへのオートコンプリートまたは候補の結果の追加に関するページを参照してください。

API の使用方法については、オートコンプリート REST API の次の呼び出しで説明します。 この例では、2 つのポイントがあります。 まず、すべてのクエリと同様に、操作はインデックスのドキュメント コレクションに対して行われ、クエリにはパラメーターが含まれます search 。この場合、部分クエリが提供されます。 次に、要求に追加 suggesterName する必要があります。 インデックスに suggester が定義されていない場合、オートコンプリートまたは候補の呼び出しは失敗します。

POST /indexes/myxboxgames/docs/autocomplete?search&api-version=2023-11-01
{
  "search": "minecraf",
  "suggesterName": "sg"
}

サンプル コード

次のステップ

要求と定式化の詳細について学習します。