前回のブログ記事では、Azure AI Searchのシノニム機能について機能概要などを紹介しました。
今回は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"アナライザーで加工すると、「united
とstates
の連続したトークンと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ポータル上で実行可能です。
Azureポータルで、対象のAI Searchインスタンスの対象インデックスにアクセスし、[JSONの編集]を選択します。
今回は"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
- 検索クエリは、
America
です。 - アナライザーで
america
に加工されます。 - 今回のシノニムのルールには合致しないので、そのまま
america
で検索されます。 america
をトークンとして含むのは、ドキュメントid 4, 5となります。
(1) 検索クエリ | (2) "standard.lucene"アナライザーで加工後 | (3) シノニムマップ適用後 | (4) 検索結果のドキュメントid |
---|---|---|---|
America |
america |
america |
4, 5 |
クエリNo.2:USA
- 検索クエリは、
USA
です。 - アナライザーで
usa
に加工されます。 - 今回のシノニムのルールでは
united
とstates
の連続したトークンとusa
というトークンを同義語として扱うので、ルールに一致し、今回の検索条件は「united
とstates
の連続したトークンまたはusa
というトークンを含むこと」が条件になります。 - 条件に合致するのは、ドキュメント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
- 検索クエリは、
USA America
です。 - アナライザーで
usa
とamerica
に加工されます。 - 今回のシノニムのルールでは
united
とstates
の連続したトークンとusa
というトークンを同義語として扱うので、ルールに一致し、今回の検索条件は「united
とstates
の連続したトークン、またはusa
というトークン、またはamerica
というトークンを含むこと」が条件になります。 - 条件に合致するのは、ドキュメント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
- 検索クエリは、
USA + America
です。 - アナライザーで
usa
とamerica
に加工されます。ただし、+
で検索語を繋いでいるためAND条件になり、usa
とamerica
のどちらも含むことが条件になります。 - 今回のシノニムのルールでは
united
とstates
の連続したトークンとusa
というトークンを同義語として扱うので、ルールに一致し、以下の表の(3)の条件になります。 - 条件に合致するのは、ドキュメント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
- 検索クエリは、
United States
です。 - アナライザーで
united
とstates
に加工されます。 - 今回のシノニムのルールでは
united
とstates
の連続したトークンとusa
というトークンを同義語として扱いますが、検索クエリのunited
とstates
は別の検索語として扱われているため、ルールには一致しません。そのため、シノニムマップを適用しても、検索条件に変化はありません。 - 条件に合致するのは、ドキュメント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"
- 検索クエリは、
"United States"
です。 "
(ダブルクォーテーション)で囲まれているため、United States
は1つのフレーズとして扱われます。アナライザーでunited
とstates
に加工されますが、united
とstates
の連続したトークンであることが条件になります。- 今回のシノニムのルールでは
united
とstates
の連続したトークンとusa
というトークンを同義語として扱います。これはまさに今回の検索クエリに一致しますので、検索条件は以下の表の(3)になります。 - この条件はクエリ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*
- 検索クエリは、
USA*
です。 *
はプレフィックスクエリを示します。前回記事で言及しましたが、プレフィックス検索、ワイルドカード検索、正規表現検索などについては、アナライザーによる加工はされず、大文字から小文字への変換がされるだけです。このクエリが示す条件は、"usa"で始まる語句をドキュメントに含むことが条件となります。- 前回の記事の注意事項に記載しましたが、ワイルドカード・プレフィックス・あいまい・正規表現検索の語句にはシノニムによる拡張は適用されないため、今回のクエリにはシノニムルールは適用されません。そのため、条件は変わらず、「"usa"で始まる語句をドキュメントに含むこと」となります。
- 条件に合致するのは、ドキュメントid 2となります。
(1) 検索クエリ | (2) "standard.lucene"アナライザーで加工後 | (3) シノニムマップ適用後 | (4) 検索結果のドキュメントid |
---|---|---|---|
USA* |
usa* |
usa* |
2 |
クエリNo.8:USA | USA*
- 検索クエリは、
USA | USA*
です。|
はOR条件を意味します。この検索クエリは、こちらのドキュメントで紹介されているシノニムとワイルドカードを組み合わせたい場合に有効なクエリです。クエリNo.7のようにワイルドカード検索ではシノニムルールが適用されないため、それを回避するためにワイルドカード文字(*
や?
の記号)を除いた検索語をOR条件で並べます。 - アナライザーで
USA
はusa
に加工されます。この時点で条件は、以下の表の(2)のようなイメージになります。 - 今回のシノニムのルールでは
united
とstates
の連続したトークンとusa
というトークンを同義語として扱いますので、ルールに一致し、以下の表の(3)の条件になります。 - 条件に合致するのは、ドキュメント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
- 検索クエリは、
UnitedStates
です。UnitedとStatesの間にスペースがありません。 UnitedStates
を"標準-Lucene"アナライザーに渡すと、unitedstates
になります。- 今回のシノニムマップのルールに
unitedstates
というトークンは含まれていませんので、ルールに一致しません。つまり、条件としては「unitedstates
というトークンを含むこと」になります。 - 条件に合致するのは、ドキュメントid 7となります。
スペースを無くすだけで、検索精度に大きな影響が出ることがわかります。このことを考慮して、UnitedStates
という語句もシノニムマップのルールに加えておくと良さそうです。
(1) 検索クエリ | (2) "standard.lucene"アナライザーで加工後 | (3) シノニムマップ適用後 | (4) 検索結果のドキュメントid |
---|---|---|---|
UnitedStates |
unitedstates |
unitedstates |
7 |
最後に
今回取り上げた内容はAI Searchのシノニム機能に関する内容でしたが、シノニム機能を理解する上でAI Searchのキーワード検索そのものの仕様が深く理解できました。
キーワード検索で検索精度を上げることの難しさも感じました。その点でベクター検索の有用性も実感できました。
AI Searchの仕組みを理解して、正しく使いこなせるようにしていきたいです。