Azure AI Search で複数の言語のインデックスを作成する

複数の言語で文字列がある場合は、インデックス作成とクエリの実行中に特定の言語の言語ルールを使って文字列を分析する言語アナライザーをアタッチできます。 言語アナライザーを使うと、文字のバリエーション、句読点、単語の原形をより適切に処理できるようになります。

Azure AI Search では、Microsoft および Lucene アナライザーがサポートされています。 既定では、検索エンジンは言語に依存しない Standard Lucene が使用されます。 テストの結果、既定のアナライザーでは不十分であることが判明した場合は、言語アナライザーに置き換えます。

Azure AI Search では、複数の言語をサポートするための次の 2 つのパターンがあります。

  • すべての英数字コンテンツが同じ言語で、検索可能なすべての文字列フィールドが同じ言語アナライザーを使用するように属性付けされている言語固有のインデックスを作成します。

  • 各フィールドの言語固有のバージョン (description_en、description_fr、description_ko など) を使用してブレンド インデックスを作成し、クエリ時にフルテキスト検索をそれらのフィールドのみに制限します。 この方法は、説明などのいくつかのフィールドでのみ言語バリアントが必要なシナリオに役立ちます。

この記事では、ブレンド インデックスで言語固有のフィールドを構成し、クエリを実行する手順とベスト プラクティスに焦点を当てます。

  • 各言語バリアントごとに文字列フィールドを定義します。
  • 各フィールドに言語アナライザーを設定します。
  • クエリ要求で、searchFields パラメーターを設定して特定のフィールドに指定し、select を使用して互換性のあるコンテンツが含まれるフィールドだけが返されるようにします。

Note

検索拡張生成 (RAG) パターンで大規模言語モデルを使っている場合は、翻訳された文字列を返すようにプロンプトを設計できます。 このシナリオはこの記事の範囲には含まれません。

前提条件

言語分析は、ローカライズされたテキストを含む、タイプ Edm.String のフィールド (searchable) に適用されます。 テキスト翻訳も必要な場合は、次のセクションを確認して、AI エンリッチメントがニーズを満たしているかどうかを確認します。

文字列以外のフィールドと検索できない文字列フィールドは字句分析を受けず、トークン化されません。 代わりに、これらは保存され、逐語的に返されます。

テキスト翻訳を追加する

この記事では、翻訳された文字列が既に存在することを前提としています。 そうでない場合は、Azure AI サービスをエンリッチメント パイプラインにアタッチして、インデックス作成中にテキスト翻訳を呼び出すことができます。 テキスト翻訳はインデクサー機能と Azure AI サービスに依存しますが、すべての設定は Azure AI Search 内で行われます。

テキスト翻訳を追加するには、次の手順に従います。

  1. サポートされているデータ ソースにコンテンツが含まれることを確認します。

  2. コンテンツを指すデータ ソースを作成します。

  3. テキスト翻訳スキルを含むスキルセットを作成します。

    テキスト翻訳スキルは、入力として 1 つの文字列を受け取ります。 複数のフィールドがある場合は、テキスト翻訳を複数回 (フィールドごとに 1 回ずつ) 呼び出すスキルセットを作成できます。 または、テキスト マージャー スキルを使用して、複数のフィールドのコンテンツを 1 つの長い文字列に統合することもできます。

  4. 翻訳された文字列のフィールドを含むインデックスを作成します。 この記事の大部分では、複数言語コンテンツのインデックスを作成してクエリを実行するために、インデックスの設計とフィールド定義について説明します。

  5. スキルセットに複数リージョンの Azure AI サービス リソースをアタッチします。

  6. インデクサーを作成して実行し、この記事のガイダンスを適用して、対象のフィールドのみにクエリを実行します。

ヒント

テキスト翻訳は、データのインポート ウィザードに組み込まれています。 サポートされているデータ ソースに翻訳対象のテキストが含まれる場合は、コードを記述する前に、ウィザードを順に実行して言語検出と翻訳機能を試すことができます。

複数言語のコンテンツのフィールドを定義する

Azure AI Search のクエリは、単一のインデックスを対象にしています。 通常、単一の検索操作で言語固有の文字列を提供したい場合は、それらの値を格納する専用のフィールドを定義します。たとえば、英語の文字列用のフィールド、フランス語用のフィールドなどです。

フィールド定義の analyzer プロパティは、言語アナライザーを設定するために使われます。 インデックス作成とクエリ実行の両方に使われます。

{
  "name": "hotels-sample-index",
  "fields": [
    {
      "name": "Description",
      "type": "Edm.String",
      "retrievable": true,
      "searchable": true,
      "analyzer": "en.microsoft"
    },
    {
      "name": "Description_fr",
      "type": "Edm.String",
      "retrievable": true,
      "searchable": true,
      "analyzer": "fr.microsoft"
    }
  ]
}

インデックスの作成と読み込み

クエリを作成する前の中間のステップがインデックスの作成と設定です。 ここでは、完全を期すためにこの手順に触れました。 インデックスの可用性を判断する 1 つの方法として、ポータルでインデックスの一覧を確認します。

クエリの制限と結果のトリミング

クエリのパラメーターは、検索を特定のフィールドに制限し、実際のシナリオには不要なフィールドの結果をトリミングするために使用されます。

パラメーター 目的
searchFields フル テキスト検索の対象を、指定したフィールドの一覧にのみ制限します。
select 応答をトリミングし、指定したフィールドのみを含めます。 既定では、すべての取得可能なフィールドが返されます。 select パラメーターを使うと、返すフィールドを選択できます。

フランス語の文字列を含むフィールドに検索を制限することが目標の場合、searchFields を使って、その言語の文字列を含むフィールドをクエリの対象にします。

クエリ要求にアナライザーを指定する必要はありません。 フィールド定義の言語アナライザーは、クエリの実行中にテキスト分析を決定します。 複数のフィールドを指定するクエリの場合、それぞれが異なる言語アナライザーを呼び出し、用語や語句は各フィールドに割り当てられたアナライザーによって同時に処理されます。

既定の検索では、取得可能とマークされているすべてのフィールドが返されます。 そのため、提供したい言語固有の検索機能に従っていないフィールドを除外する場合があります。 具体的に説明すると、フランス語の文字列を含むフィールドに検索を制限する場合、英語の文字列を含むフィールドを結果から除外するのではないでしょうか。 select クエリ パラメーターを使うと、呼び出し元アプリケーションに返すフィールドを制御できます。

REST の例

POST https://[service name].search.windows.net/indexes/hotels-sample-index/docs/search?api-version=2020-06-30
{
    "search": "animaux acceptés",
    "searchFields": "Tags, Description_fr",
    "select": "HotelName, Description_fr, Address/City, Address/StateProvince, Tags",
    "count": "true"
}

C# の例

private static void RunQueries(SearchClient srchclient)
{
    SearchOptions options;
    SearchResults<Hotel> response;

    options = new SearchOptions()
    {
        IncludeTotalCount = true,
        Filter = "",
        OrderBy = { "" }
    };

    options.Select.Add("HotelId");
    options.Select.Add("HotelName");
    options.Select.Add("Description_fr");
    options.SearchFields.Add("Tags");
    options.SearchFields.Add("Description_fr");

    response = srchclient.Search<Hotel>("*", options);
    WriteDocuments(response);
}

言語固有フィールドを強化する

クエリを発行するエージェントの言語が不明な場合もありますが、その場合は、すべてのフィールドに対して同時にクエリを発行できます。 スコアリング プロファイルを使用すると、特定言語の結果に対する優先度を定義できます。 次の例では、フランス語の説明で見つかった一致項目には、他の言語の一致項目に比べて高いスコアが付けられます。

  "scoringProfiles": [
    {
      "name": "frenchFirst",
      "text": {
        "weights": { "description_fr": 2 }
      }
    }
  ]

次に、検索要求にスコアリング プロファイルを含めます。

POST /indexes/hotels/docs/search?api-version=2023-11-01
{
  "search": "pets allowed",
  "searchFields": "Tags, Description_fr",
  "select": "HotelName, Tags, Description_fr",
  "scoringProfile": "frenchFirst",
  "count": "true"
}

次のステップ