Amazon Elasticsearch Serviceでkuromojiを使って日本語全文検索する

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

[新機能]Amazon Elasticsearch Serviceがリリースされました!でお伝えした通り、Amazon Elasticsearch Service(Amazon ES)はICU AnalysisKuromojiをサポートしています。最初から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が含まれているのは、日本においてはすごく重要です。すぐ日本語のシステムで使えますね!