Azure AI Searchのシノニム機能【2. 実践編】

前回のブログ記事では、Azure AI Searchのシノニム機能について機能概要などを紹介しました。

blog.jbs.co.jp

今回はREST APIを使用して、実際にシノニム機能を操作して、その検索挙動を確認します。

はじめに

本記事では、Azure AI Search(以下 AI Search)のシノニム機能について、以下の流れで操作します。

  • シノニムマップ割り当て済みのインデックスを作成する
    • インデックスを用意する
    • REST APIでシノニムマップを作成する
    • フィールドに対してシノニムマップを割り当てる
  • 検索を実行し、検索の挙動を確認する

AI Search シノニム機能の概要や検索の流れについては、前回の記事で説明しています。前回記事を読んでいただけると、本記事の内容も理解しやすいと思います。

シノニムマップ割り当て済みのインデックスを作成する

インデックスを用意する

今回の検索対象となるAI Searchのインデックスは、以下のフィールド設定で用意しました。検索対象のテキストを格納するフィールドとして、"text"フィールドを用意しています。なお、インデックス作成までの工程は本記事では省略します。

フィールド名 属性 アナライザー
id string 取得可能 -(検索可能フィールドではない)
text string 取得可能 / 検索可能 standard.lucene(標準 - Lucene)

作成したインデックスに対して、以下のドキュメントを登録しました。今回はシノニム機能の挙動を確認する目的なので、似たような単語を登録しました。

{
    "id": "1",
    "text": "US"
},
{
    "id": "2",
    "text": "USA"
},
{
    "id": "3",
    "text": "United States"
},
{
    "id": "4",
    "text": "America"
},
{
    "id": "5",
    "text": "United States of America"
},
{
    "id": "6",
    "text": "United-States"
},
{
    "id": "7",
    "text": "UnitedStates"
}

"text"フィールドに適用しているアナライザーは"standard.lucene"ですので、"text"フィールドは以下のようにトークン化されます。

ドキュメントid "text"フィールドの内容 "standard.lucene"アナライザーでトークン化後
1 US us
2 USA usa
3 United States united / states
4 America america
5 United States of America united / states / of / america
6 United-States united / states
7 UnitedStates unitedstates

これを転置インデックスで示すと以下のようになります。

トークン ドキュメントid
us 1
usa 2
united 3, 5, 6
states 3, 5, 6
america 4, 5
of 5
unitedstates 7

REST APIでシノニムマップを作成する

次に、シノニムマップをAI Searchインスタンスに作成します。

前回記事で言及しましたが、シノニムマップの作成や編集に関しては、AzureポータルのGUIでサポートされていません。そのため、REST APIや各種言語のAI Search用のSDKを使用して操作する必要があります。今回はREST API経由で作成を実施します。

以下のルールを1つだけ含む "synonym-map-01" という名前のシノニムマップを作成します。

United States, USA

このルールは"標準-Lucene"アナライザーで加工すると、「unitedstatesの連続したトークンとusaというトークンを同義語として扱う」という意味になります。

シノニムマップの作成に関しては、次のリクエストで実行できます。

POST https://[AI Searchの名前].search.windows.net/synonymmaps?api-version=[APIバージョン]      
  Content-Type: application/json  
  api-key: [AI SearchのAPIキー]
{
    "name" : "[シノニムマップの名前]",  
    "format" : "solr",
    "synonyms" : "[ルールを列挙する。ルール同士は\nで区切る。]"
}

Postmanで以下のようにPOSTリクエストして、シノニムマップを作成しました。

他にもAPIを経由してシノニムマップの削除・取得・一覧表示・更新が可能です。

※参考:シノニム マップの作成 - Azure AI Search | Microsoft Learn

フィールドに対してシノニムマップを割り当てる

最後に、先ほど作成したシノニムマップを、最初に作成したインデックスのフィールドに対して割り当てます。この操作は、Azureポータル上で実行可能です。

  1. Azureポータルで、対象のAI Searchインスタンスの対象インデックスにアクセスし、[JSONの編集]を選択します。

  2. 今回は"text"フィールドに対して、"synonym-map-01"というシノニムマップを割り当てます。そのため、以下のように"text"フィールドの"synonymMaps"プロパティに、"synonym-map-01"を追加して保存します。

以上でシノニム機能を利用した検索インデックスの準備は完了です。

検索を実行する

検索方法

検索の準備ができましたので、早速検索を試していきましょう。

検索の実行手段として様々な手段がありますが、ここでは最も手軽なAzureポータルの"検索エクスプローラー"で実行します。

"America"というキーワードで検索したい場合は、検索エクスプローラーに以下のように入力するだけです。

検索条件について少し詳しく説明します。この検索エクスプローラーを"JSONビュー"で表示すると、以下のようになります。検索エクスプローラーではSearch POST REST API を利用していて、その際のリクエスト本文が以下のJSONになるということです。

この場合、searchプロパティしかありませんが、Search POST REST APIのJSONスキーマには他にも様々なプロパティがあります。

キーワード検索で主に重要となるのは、queryType, search, searchFields, searchModeなどのプロパティです。

それらのデフォルト値を考慮すると、検索エクスプローラーの"クエリビュー"で単純にクエリを入力した場合は、「入力された検索クエリを"単純なクエリ構文"で解釈して、すべての検索可能フィールドに対して検索する。複数の検索語が入力されている場合は、ドキュメントに検索語のいずれかが含まれていれば結果に含める。」という検索を実行していることになります。

検索結果と考察

今回は検索エクスプローラーで9つの検索クエリを投げました。その結果を以下の表にまとめした。

(1)が検索クエリで、(4)が検索でヒットしたドキュメントidです。(2)と(3)は検索結果を考察する上で、検索クエリがどのように解釈されて検索に用いられたかを理解する際の補足情報です。

前回のブログ記事で詳細に説明しましたが、(1)検索クエリはアナライザーで加工されて(2)の状態になり、その後シノニムマップが適用されて(3)となり、検索が実行されます。

クエリNo. (1) 検索クエリ (2) "standard.lucene"アナライザーで加工後 (3) シノニムマップ適用後 (4) 検索結果のドキュメントid
1 America america america 4, 5
2 USA usa (united states連続) OR usa 2, 3, 5, 6
3 USA America usa OR america ((united states連続) OR usa) OR america 2, 3, 4, 5, 6
4 USA + America usa AND america ((united states連続) OR usa) AND america 5
5 United States united OR states united OR states 3, 5, 6
6 "United States" united states連続 (united states連続) OR usa 2, 3, 5, 6
7 USA* usa* usa* 2
8 USA | USA* usa OR usa* ((united states連続) OR usa) OR usa* 2, 3, 5, 6
9 UnitedStates unitedstates unitedstates 7

それでは、それぞれの検索クエリとその結果を一つずつ考察していきます。

クエリNo.1:America
  1. 検索クエリは、Americaです。
  2. アナライザーでamericaに加工されます。
  3. 今回のシノニムのルールには合致しないので、そのままamericaで検索されます。
  4. americaをトークンとして含むのは、ドキュメントid 4, 5となります。
(1) 検索クエリ (2) "standard.lucene"アナライザーで加工後 (3) シノニムマップ適用後 (4) 検索結果のドキュメントid
America america america 4, 5
クエリNo.2:USA
  1. 検索クエリは、USAです。
  2. アナライザーでusaに加工されます。
  3. 今回のシノニムのルールではunitedstatesの連続したトークンとusaというトークンを同義語として扱うので、ルールに一致し、今回の検索条件は「unitedstatesの連続したトークンまたはusaというトークンを含むこと」が条件になります。
  4. 条件に合致するのは、ドキュメントid 2, 3, 5, 6となります。
(1) 検索クエリ (2) "standard.lucene"アナライザーで加工後 (3) シノニムマップ適用後 (4) 検索結果のドキュメントid
USA usa (united states連続) OR usa 2, 3, 5, 6
クエリNo.3:USA America
  1. 検索クエリは、USA Americaです。
  2. アナライザーでusaamericaに加工されます。
  3. 今回のシノニムのルールではunitedstatesの連続したトークンとusaというトークンを同義語として扱うので、ルールに一致し、今回の検索条件は「unitedstatesの連続したトークン、またはusaというトークン、またはamericaというトークンを含むこと」が条件になります。
  4. 条件に合致するのは、ドキュメントid 2, 3, 4, 5, 6となります。
(1) 検索クエリ (2) "standard.lucene"アナライザーで加工後 (3) シノニムマップ適用後 (4) 検索結果のドキュメントid
USA America usa OR america ((united states連続) OR usa) OR america 2, 3, 4, 5, 6
クエリNo.4:USA + America
  1. 検索クエリは、USA + Americaです。
  2. アナライザーでusaamericaに加工されます。ただし、+で検索語を繋いでいるためAND条件になり、usaamericaのどちらも含むことが条件になります。
  3. 今回のシノニムのルールではunitedstatesの連続したトークンとusaというトークンを同義語として扱うので、ルールに一致し、以下の表の(3)の条件になります。
  4. 条件に合致するのは、ドキュメントid 5となります。
(1) 検索クエリ (2) "standard.lucene"アナライザーで加工後 (3) シノニムマップ適用後 (4) 検索結果のドキュメントid
USA + America usa AND america ((united states連続) OR usa) AND america 5
クエリNo.5:United States
  1. 検索クエリは、United Statesです。
  2. アナライザーでunitedstatesに加工されます。
  3. 今回のシノニムのルールではunitedstatesの連続したトークンとusaというトークンを同義語として扱いますが、検索クエリのunitedstatesは別の検索語として扱われているため、ルールには一致しません。そのため、シノニムマップを適用しても、検索条件に変化はありません。
  4. 条件に合致するのは、ドキュメントid 3, 5, 6となります。
(1) 検索クエリ (2) "standard.lucene"アナライザーで加工後 (3) シノニムマップ適用後 (4) 検索結果のドキュメントid
United States united OR states united OR states 3, 5, 6
クエリNo.6:"United States"
  1. 検索クエリは、"United States"です。
  2. "(ダブルクォーテーション)で囲まれているため、United Statesは1つのフレーズとして扱われます。アナライザーでunitedstatesに加工されますが、unitedstatesの連続したトークンであることが条件になります。
  3. 今回のシノニムのルールではunitedstatesの連続したトークンとusaというトークンを同義語として扱います。これはまさに今回の検索クエリに一致しますので、検索条件は以下の表の(3)になります。
  4. この条件はクエリNo.2と同じで、ヒットするドキュメントid 2, 3, 5, 6となります。
(1) 検索クエリ (2) "standard.lucene"アナライザーで加工後 (3) シノニムマップ適用後 (4) 検索結果のドキュメントid
"United States" united states連続 (united states連続) OR usa 2, 3, 5, 6
クエリNo.7:USA*
  1. 検索クエリは、USA*です。
  2. *はプレフィックスクエリを示します。前回記事で言及しましたが、プレフィックス検索、ワイルドカード検索、正規表現検索などについては、アナライザーによる加工はされず、大文字から小文字への変換がされるだけです。このクエリが示す条件は、"usa"で始まる語句をドキュメントに含むことが条件となります。
  3. 前回の記事の注意事項に記載しましたが、ワイルドカード・プレフィックス・あいまい・正規表現検索の語句にはシノニムによる拡張は適用されないため、今回のクエリにはシノニムルールは適用されません。そのため、条件は変わらず、「"usa"で始まる語句をドキュメントに含むこと」となります。
  4. 条件に合致するのは、ドキュメントid 2となります。
(1) 検索クエリ (2) "standard.lucene"アナライザーで加工後 (3) シノニムマップ適用後 (4) 検索結果のドキュメントid
USA* usa* usa* 2
クエリNo.8:USA | USA*
  1. 検索クエリは、USA | USA*です。|はOR条件を意味します。この検索クエリは、こちらのドキュメントで紹介されているシノニムとワイルドカードを組み合わせたい場合に有効なクエリです。クエリNo.7のようにワイルドカード検索ではシノニムルールが適用されないため、それを回避するためにワイルドカード文字(*?の記号)を除いた検索語をOR条件で並べます。
  2. アナライザーでUSAusaに加工されます。この時点で条件は、以下の表の(2)のようなイメージになります。
  3. 今回のシノニムのルールではunitedstatesの連続したトークンとusaというトークンを同義語として扱いますので、ルールに一致し、以下の表の(3)の条件になります。
  4. 条件に合致するのは、ドキュメントid 2, 3, 5, 6となります。
(1) 検索クエリ (2) "standard.lucene"アナライザーで加工後 (3) シノニムマップ適用後 (4) 検索結果のドキュメントid
USA | USA* usa OR usa* ((united states連続) OR usa) OR usa* 2, 3, 5, 6
クエリNo.9:UnitedStates
  1. 検索クエリは、UnitedStatesです。UnitedとStatesの間にスペースがありません。
  2. UnitedStatesを"標準-Lucene"アナライザーに渡すと、unitedstatesになります。
  3. 今回のシノニムマップのルールにunitedstatesというトークンは含まれていませんので、ルールに一致しません。つまり、条件としては「unitedstatesというトークンを含むこと」になります。
  4. 条件に合致するのは、ドキュメントid 7となります。

スペースを無くすだけで、検索精度に大きな影響が出ることがわかります。このことを考慮して、UnitedStatesという語句もシノニムマップのルールに加えておくと良さそうです。

(1) 検索クエリ (2) "standard.lucene"アナライザーで加工後 (3) シノニムマップ適用後 (4) 検索結果のドキュメントid
UnitedStates unitedstates unitedstates 7

最後に

今回取り上げた内容はAI Searchのシノニム機能に関する内容でしたが、シノニム機能を理解する上でAI Searchのキーワード検索そのものの仕様が深く理解できました。

キーワード検索で検索精度を上げることの難しさも感じました。その点でベクター検索の有用性も実感できました。

AI Searchの仕組みを理解して、正しく使いこなせるようにしていきたいです。

執筆担当者プロフィール
赤津 陸

赤津 陸(日本ビジネスシステムズ株式会社)

Azure環境向けのクラウドマネージドサービスの運用に従事し、現在はAI関連の業務をしています。

担当記事一覧