Amazon Elasticsearch Serviceでkuromojiを使って日本語全文検索する
はじめに
[新機能]Amazon Elasticsearch Serviceがリリースされました!でお伝えした通り、Amazon Elasticsearch Service(Amazon ES)はICU AnalysisとKuromojiをサポートしています。最初からKuromojiをサポートしているというのが本当にナイス。
そんなわけで、Amazon ESで、Kuromojiを使って日本語全文検索をしてみました。
やってみた
まずは、Kuromojiをtokenizer及びanalyzerとして使うIndexを作成します。
$ curl -XPOST 'http://search-myes-hoge.ap-northeast-1.es.amazonaws.com/kuromoji/' -d' { "index":{ "analysis":{ "tokenizer" : { "kuromoji" : { "type" : "kuromoji_tokenizer" } }, "analyzer" : { "analyzer" : { "type" : "custom", "tokenizer" : "kuromoji" } } } } }'
そしてデータを投入してみます。以下のように、3つのデータを入れました。
$ curl -XPOST 'http://search-myes-hoge.ap-northeast-1.es.amazonaws.com/kuromoji/data/' -d ' { "title" : "梶さんの秘密のメモ", "text" : "コカコーラ大好き" }' {"_index":"kuromoji","_type":"data","_id":"AVAmDgheeFCp6h-hHJoZ","_version":1,"created":true} $ curl -XPOST 'http://search-myes-hoge.ap-northeast-1.es.amazonaws.com/kuromoji/data/' -d ' { "title" : "渡辺さんの秘密のメモ", "text" : "毎週末自転車乗ってる" }' {"_index":"kuromoji","_type":"data","_id":"AVAmDbFReFCp6h-hHJoY","_version":1,"created":true} $ curl -XPOST 'http://search-myes-hoge.ap-northeast-1.es.amazonaws.com/kuromoji/data/' -d ' { "title" : "佐々木の秘密のメモ", "text" : "自転車持ってるけど乗ってない、コーラよりビール好き" }' {"_index":"kuromoji","_type":"data","_id":"AVAmEiN8eFCp6h-hHJoa","_version":1,"created":true}
では、まず「自転車」で検索してみます。
$ curl -XGET 'http://search-myes-hoge.ap-northeast-1.es.amazonaws.com/kuromoji/data/_search' -d ' { "query":{"match":{"text":"自転車"}} }'
すると、以下のようにtextに自転車を含む2つのデータがヒットしました!
{ "took": 8, "timed_out": false, "_shards": { "total": 5, "successful": 5, "failed": 0 }, "hits": { "total": 2, "max_score": 0.32180142, "hits": [ { "_index": "kuromoji", "_type": "data", "_id": "AVAmDbFReFCp6h-hHJoY", "_score": 0.32180142, "_source": { "title": "渡辺さんの秘密のメモ", "text": "毎週末自転車乗ってる" } }, { "_index": "kuromoji", "_type": "data", "_id": "AVAmEiN8eFCp6h-hHJoa", "_score": 0.225261, "_source": { "title": "佐々木の秘密のメモ", "text": "自転車持ってるけど乗ってない、コーラよりビール好き" } } ] } }
次に「大好き」で検索してみます
$ curl -XGET 'http://search-myes-hoge.apast-1.es.amazonaws.com/kuromoji/data/_search' -d ' { "query":{"match":{"text":"大好き"}} }'
以下のように2件のデータがヒットしました。このうち「大好き」が含まれたデータは3文字マッチしているので_scoreが高く、「好き」が含まれたデータは2文字しかマッチしていないので_scoreが低いです。ちゃんと日本語を分かち書きで検索できてますね。
{ "took": 3, "timed_out": false, "_shards": { "total": 5, "successful": 5, "failed": 0 }, "hits": { "total": 2, "max_score": 0.26574233, "hits": [ { "_index": "kuromoji", "_type": "data", "_id": "AVAmDgheeFCp6h-hHJoZ", "_score": 0.26574233, "_source": { "title": "梶さんの秘密のメモ", "text": "コカコーラ大好き" } }, { "_index": "kuromoji", "_type": "data", "_id": "AVAmEiN8eFCp6h-hHJoa", "_score": 0.13221094, "_source": { "title": "佐々木の秘密のメモ", "text": "自転車持ってるけど乗ってない、コーラよりビール好き" } } ] } }
ということで、複雑なインストールや設定をしなくても、そのまま日本語全文検索が使えます!
さいごに
まぁ、結局中身がElasticsearchなので当然できて当たり前なのですが、Amazon ESとしてはプラグインの追加機能が提供されていないため、最初からKuromojiが含まれているのは、日本においてはすごく重要です。すぐ日本語のシステムで使えますね!