Synonyms in Azure Search - Japanese
Azure Search にシノニム機能が Public Preview として追加されたので、日本語で試しました。
※追記:2018/7/3 Public Previewが外れGAしました。
Azure Search で synonyms が GA! https://t.co/04MESGlJhi
— Takekazu Omi (@takekazuomi) July 3, 2018
API Versionが、2016-09-01-Preview から、2017-11-11 になった。 SDK version 5.0.0 でサポート。
ドキュメントの更新を漁ったが、この程度の変更らしいhttps://t.co/kiScsjscD2#azurejp
参照:
- Azure Search releases support for synonyms (public preview) | Blog | Microsoft Azure
- Synonyms preview tutorial in Azure Search | Microsoft Docs
- Synonyms in Azure Search (preview) | Microsoft Docs
- Synonyms in Azure Search | Data Exposed | Channel 9
シノニム
シノニム - Wikipedia シノニム(synonym)とは、類語や同意語といった意味です。 検索エンジンでは、ある言葉で検索した場合に、違う言葉でヒットさせるための機能をいいます。
- シノニム(同義語)機能でユーザーに柔軟な検索システムを提供する (1/3):CodeZine(コードジン)
- Amazon CloudSearch のテキスト分析スキームの設定 - Amazon CloudSearch
たとえば、ユーザーが「いか」と検索したときは「するめ」を表すドキュメントをヒットさせたい、といったときに、”「いか」は「するめ」”という意味のシノニム辞書を作成します。
Azure Search でのシノニム機能
Azure Search では、現在シノニム機能は Public Preview です。よってプロダクション環境での使用は推奨されません。
また、REST API (api-version=2016-09-01-Preview)と、.NET SDK にて使えます(ポータルでは対応していません)。(GAしました。API-Versionはドキュメントにて確認します)
ステップ
シノニム機能を使うには、次の2ステップを行います。
- シノニムマップを作成する。
- (この言葉はこの言葉にマップする、という情報を登録する)
- インデックス定義のフィールドに、シノニムマップを適用する。
- (このフィールドは、このシノニムマップを参照して検索できるようにする、という情報を登録する)
この2ステップは、Azure Search releases support for synonyms (public preview) | Blog | Microsoft Azure ここに記載されている API のことです。シノニムマップは、REST API の POST・PUT のメソッドにより作成・更新します。
その他
他に以下のような特徴があります(把握している範囲です)。
- シノニムマップを更新した場合、インデックスの再構築やサービスが中断されるということは無い。
- 1つのフィールドには、1つのシノニムマップしか適用できない(現在は)。
- ヒットハイライティングとスコアリングプロファイルは、元のワードと同意語の両方を同等として扱う。
- Filter, Facet, Suggestion は、シノニムマップが適用されない。
- シノニムマップは、Solr の SynonymFilterFactory のフォーマットで記述する。
シノニムマップのフォーマットはこんな感じです:
インターネット,internet,ワイファイ,wifi\n five star=>高級\n 旅亭,旅荘=>旅館
インデックスの再構築を行わない、ということは、あまりに複雑で大量なシノニムマップを作成すると、検索が遅くなるのかな?と推測しています。
コンソールアプリで試してみる
ということで、日本語で試してみました。.NET SDK を使い、コンソールアプリケーションを作成します。 Azrue Search が提供するサンプル こちらをベースに、日本語に書き換えてみました。
インデックスの定義や、ドキュメントの作成など全てコンソールアプリケーションから行っています。
手順
・Azure Search をプロビジョニングします。
・Azrue Search が提供するサンプルを取得し、App.config にある設定(サービス名・管理キー・クエリキー)を書き換えます。
・Hotel.cs の Category と Tags のフィールドに [Analyzer(AnalyzerName.AsString.JaLucene)]
を定義します。
[IsSearchable, IsFilterable, IsSortable, IsFacetable] [Analyzer(AnalyzerName.AsString.JaLucene)] public string Category { get; set; } [IsSearchable, IsFilterable, IsFacetable] [Analyzer(AnalyzerName.AsString.JaLucene)] public string[] Tags { get; set; }
・ドキュメントを作成している UploadDocuments メソッドにて、次のように日本語に置き換えます。
private static void UploadDocuments(ISearchIndexClient indexClient) { var hotels = new Hotel[] { new Hotel() { HotelName = "東京ホテル", Category = "ホテル", Tags = new[] { "ジャグジー", "夜景", "wifi", "送迎", "高級"}, HotelId = "1", //略 }, new Hotel() { HotelName = "神奈川旅館", Category = "旅館", Tags = new[] { "温泉", "内湯", "大浴場", "露天風呂"}, HotelId = "2", // 略
・シノニムマップを作成している UploadSynonyms メソッドにて、次のように記述します。
private static void UploadSynonyms(SearchServiceClient serviceClient) { var synonymMap = new SynonymMap() { Name = "desc-synonymmap", Format = "solr", Synonyms = "インターネット,internet,ワイファイ,wifi\nfive star=>高級\n旅亭,旅荘=>旅館" }; serviceClient.SynonymMaps.CreateOrUpdate(synonymMap); Console.WriteLine("UploadSynonyms"); }
コードは gist にアップしました:gist
こんな感じ
以上の手順により、次の2つのドキュメントを作成しています。
Name | Category | Tags |
---|---|---|
東京ホテル | ホテル | [ジャグジー, 夜景, wifi, 送迎, 高級] |
神奈川旅館 | 旅館 | [温泉, 内湯, 大浴場, 露天風呂] |
シノニムマップはこのように。
インターネット,internet,ワイファイ,wifi\n five star=>高級\n 旅亭,旅荘=>旅館
以下の検索に対応したいため、上記のようなシノニムマップを作成しました。
- 「"five star"」(double quot付き)で検索すると「東京ホテル」がヒットする
- 「インターネット」で検索すると「東京ホテル」がヒットする
- 「旅亭」で検索すると「神奈川旅館」がヒットする
結果
シノニムを作成する前 は、検索しても該当しません。
1. Search the entire index for the phrase "five star": no document matched 2. Search the entire index for the term 'インターネット': no document matched 3. Search the entire index for the term '旅亭': no document matched 4. Search the entire index for the terms 'インターネット' AND 'five star': no document matched
シノニムを作成した後は、期待したように検索結果がヒットします。
1. Search the entire index for the phrase "five star": Name: 東京ホテル Category: ホテル Tags: [ジャグジー, 夜景, wifi, 送迎, 高級] 2. Search the entire index for the term 'インターネット': Name: 東京ホテル Category: ホテル Tags: [ジャグジー, 夜景, wifi, 送迎, 高級] 3. Search the entire index for the term '旅亭': Name: 神奈川旅館 Category: 旅館 Tags: [温泉, 内湯, 大浴場, 露天風呂] 4. Search the entire index for the terms 'インターネット' AND 'five star': Name: 東京ホテル Category: ホテル Tags: [ジャグジー, 夜景, wifi, 送迎, 高級]
シノニムマップを更新する
さらに、「リッチ」で検索したときに「高級」でヒットするように、シノニムマップを更新します。
次のように「リッチ」を追加して、UploadSynonyms
メソッドを実行します。
これはつまり、API: PUT https://[servicename].search.windows.net/synonymmaps/desc-synonymmap?api-version=2016-09-01-Preview
を送信します。インデックスの定義は更新していません。
private static void UploadSynonyms(SearchServiceClient serviceClient) { var synonymMap = new SynonymMap() { Name = "desc-synonymmap", Format = "solr", Synonyms = "インターネット,internet,ワイファイ,wifi\nリッチ,five star=>高級\n旅亭,旅荘=>旅館" };
更新後、検索すると「リッチ」で「東京ホテル」がヒットするようになりました。
5. Search the entire index for the term 'リッチ': Name: 東京ホテル Category: ホテル Tags: [ジャグジー, 夜景, wifi, 送迎, 高級]