Amazon CloudSearch で 商品検索を実現する - No.2 シノニム

# やりたいこと

CloudSearchが提供する分析スキーマのシノニムを機能を利用して、入力の誤りの訂正と表記の違いを扱えるようにします。

[公式ドキュメント](https://docs.aws.amazon.com/ja_jp/cloudsearch/latest/developerguide/configuring-analysis-schemes.html#synonyms)にはこのように書かれています。

> 検索しているデータ内に存在する用語に対してシノニムを設定できます。そうすることで、インデックス用語ではなくシノニムを検索した場合、結果にはインデックスされた用語が含まれるドキュメントが含まれます。たとえば、カスタムシノニムを定義して次のようなことができます。
・ 一般的な綴りの誤りを正しい綴りにマッピングする
・ film と movie のような、同等の用語を定義する
・ fish と barracuda のように、一般的な用語をより特殊な用語にマッピングする
・ tool box と toolbox のように、複数の単語を 1 つの単語に (またはその逆も) マッピングする

もう少し読むと具体性がでてきます。
> 次の 2 通りの方法でシノニムを指定できます。
・グループ内の各用語はグループ内の他のすべての用語のシノニムと見なされる合成グループとして。
・特定の用語のエイリアスとして。 エイリアスは指定した用語のシノニムと見なされますが、用語はエイリアスのシノニムとは見なされません。 

## グループ 
ハードウェアの「ファミリーコンピューター」、「ファミコン」、「FC」は同じものを指している単語なので、グループを使って同じ意味の用語として扱います。

## エイリアス
言葉の置き換えや頻度が高い誤記の訂正としての用途として、「ファイ**ヤ**ーエ**ン**ブレム」は「ファイ**ア**ーエ**ム**ブレム」を訂正して検索が行われる様にします。

## グループとエイリアスの違い
グループは同一とみなすので「ファミリーコンピューター」=「ファミコン」=「FC」の関係になります。他方、エイリアスは一方通行なので「ファイヤーエンブレム」→「ファイアーエムブレム」の関係になります。

# CloudSearchの管理コンソールから分析スキーマを作成しシノニムを設定
新しく分析スキーマを作成します。作成した分析スキーマは、後で行いますが、フィールドのAnalysis Schemeに指定することで検索結果に反映されます。そのため適用するフィールドを意識して作成するのが望ましいと思います。

ですが、今回作成する分析スキーマは一つだけです。

分析スキーマは管理コンソールのAnalysis Schemes を選択して、**Add Analysis Schemes**を押下すると、作成用のダイアログが表示されます。

![01-synonym-starting.png](https://qiita-image-store.s3.amazonaws.com/0/145742/508ad290-6396-0b07-ee4f-881787b5a7fa.png)


## Analysis Scheme Name と Analysis Scheme Language を設定
* Analysis Scheme Name に分析スキーマ名を設定します。今回は「test_scheme」しました。
* Analysis Scheme Language はJapaneseを選択します。

![02-entry-name.png](https://qiita-image-store.s3.amazonaws.com/0/145742/c5e5e61a-58fe-6c8b-f4e4-7885a0ac92db.png)

## Synonyms タブ
**左側にエイリアス**を、**右側にグループ**を設定します。

![03-synonym.png](https://qiita-image-store.s3.amazonaws.com/0/145742/5dd443b5-3343-1263-76e5-89f81bacfbac.png)

### エイリアス
**Add Term**に正しい名称の「ファイヤーエンブレム」を入れ、**Aliases**に「ファイアーエムブレム」を入れます。入れ終わった後に**Add**を押下すると、その下の**Current Synonym Aliases**に追加されます。

### グループ
**Synonym Group**に同じグループにしたい単語を入れていきます。テキストボックスの右側にある**＋**を押下するとテキストボックスが追加されます。1グループ分の単語を入れ終えた後に、**Add**を押下するとその下の**Current Synonym Groups**に追加されます。


## Tokenization Dictionary タブ
Analysis Scheme Language を Japaneseにすると新しいタブが追加されます。

このタブが未入力で**Create**ボタンを押下すると、Invalid Type エラーが発生するので何かを入力します。ひとまず、Excampleの内容をそのまま入れます。

![04-Tokenaization.png](https://qiita-image-store.s3.amazonaws.com/0/145742/f0027322-bff9-7fd8-72db-911d46243a1d.png)


## Createボタン
一通りの入力を行ったら、ダイアログの右下にある**Create**ボタンを押下して、分析スキーマの作成を完了します。

# フィールドに分析スキーマを適用
## Analysis Scheme を変更
分析スキーマは作成するだけでは検索結果に影響を与えません。Indexing Options で適用したいフィールドの Analysis Scheme を作成した分析スキーマに変更します。Analysis Scheme のプルダウンリストから分析スキーマを選択します。複数のフィールドに分析スキーマを適用する場合は、適用したいフィールドのAnalysis Scheme を変更します。
最後に**Submit**ボタンを押下して、Analysis Scheme の変更を確定します。

![05-modify-inex-fields.png](https://qiita-image-store.s3.amazonaws.com/0/145742/baac2d70-176c-5108-67a2-552de101227a.png)



## インデックスを再構築
Analysis Scheme の変更を確定すると、変更したフィールドのStatusが「Needs Indexing」になっています。インデックスを再構築するために、**Run Indexing**を押下します。

![06-need-rebuild-index.png](https://qiita-image-store.s3.amazonaws.com/0/145742/88161eca-5bb6-2c19-51ad-a752b1c978d1.png)

インデックスの再構築には時間がかかるので、(30分では終わりませんでした)暫く待ちます。インデックス再構築中はDashBoard に表示されているドメインのステータスが「PROCESSING」になっています。終了すると「ACTIVE」に戻ります。

# 分析スキーマを適用した検索の結果

## エイリアス
検索語を「ファイヤーエンブレム」にしていますが、「ファイアーエムブレム」がヒットしています。検索語がハイライト表示されていることでも、Aliasが適用されているのが分かります。
![06-result-alias.png](https://qiita-image-store.s3.amazonaws.com/0/145742/77e86113-b4b1-ef5d-f2ea-c6b9389f4b3c.png)

## グループ
検索語の「FC」に加えて、「ファミコン」もヒットしています。「ファミコン」がハイライト表示さえている個所とそうでない箇所があるのは、フィールドのAnalysis Schemeを「test_scheme」にしたフィールドは分析スキーマの定義が適用されたので、ハイライト表示されています。

![07-result-group.png](https://qiita-image-store.s3.amazonaws.com/0/145742/f9436335-ffd5-6811-2007-68e04d14c34d.png)



# 参考資料

[AWS Black Belt Techシリーズ Amazon CloudSearch](http://www.slideshare.net/AmazonWebServicesJapan/aws-black-belt-tech-amazon-cloudsearch)