手間をかけずに形態素解析を Elasticsearch Service (on AWS) で用意する

この記事は[Elasticsearch Advent Calendar 2015](http://qiita.com/advent-calendar/2015/elasticsearch)の10日目の記事です。

## Elasticsearch Service とは

AWS が提供している Elasticsearch に特化したサービスです。

[Amazon Elasticsearch Service](https://aws.amazon.com/jp/elasticsearch-service/)

Elasticsearch の Config や Plugin は柔軟に設定できませんが、運用上のめんどくささから全て解放されるのでオススメします。

では、Elasticsearch を気軽に使用する環境がなければダッシュボードに行ってドメインを作成してください。

[Amazon Elasticsearch Service dashboard](https://ap-northeast-1.console.aws.amazon.com/es/home?region=ap-northeast-1)

![Screen_Shot_2015-12-10_at_8_18_50_PM.png](https://qiita-image-store.s3.amazonaws.com/0/3353/5518a409-f530-c1f9-9eb6-1810ceccf597.png)


### Configure cluster

Node configuration にある Instance type を `t2.micro.elasticsearch` に設定して無料枠の恩恵を受けましょう。その際 Storage configuration にある Storage type を `EBS` にしてください。

### Set up access policy

ここは自由にポリシーを設定してください。僕の場合はプロキシサーバをかましているため、特定のIPからのアクセスだけに公開して使用しています。
公開しても構わない人は Set the domain access policy to に `Allow open access to the domain` を設定してください。

他は適当に進めてください。4ページくらいで作成が完了になって、数分まてばドメインがダッシュボードに作成されています。

ダッシュボードから作成されたドメインに遷移すると下記の画像のページに移ります。

![Screen_Shot_2015-12-10_at_8_23_59_PM.png](https://qiita-image-store.s3.amazonaws.com/0/3353/d235777a-5936-ed24-c6f2-b94f098d93e6.png)

矢印にあるリンクが Elasticsearch のエンドポイントとなります。仮に叩いてみて下記のJSONが返却されればOKです。

```json
{
  "status" : 200,
  "name" : "Vivisector",
  "cluster_name" : "123456789012:hogehoge",
  "version" : {
    "number" : "1.5.2",
    "build_hash" : "62ff9868b4c8a0c45860bebb259e21980778ab1c",
    "build_timestamp" : "2015-04-27T09:21:06Z",
    "build_snapshot" : false,
    "lucene_version" : "4.10.4"
  },
  "tagline" : "You Know, for Search"
}
```

## 解析方法

Elasticsearch で日本語の形態素解析をする場合、語句解析に Kuromoji プラグインを使用します。
Elasticsearch のv2からはデフォルトで Kuromoji プラグインは組み込まれるようになりますが、v2未満の場合は手動でインストールしなければなりません。

**が**、Elasticsearch Service (v1.5.2) では標準で準備されています。マジ神。（手動インストールも簡単ですけどね）

_手動インストールの場合_

```sh
$ bin/plugin --install elasticsearch/elasticsearch-analysis-kuromoji/2.5.0
$ echo 'index.analysis.analyzer.default.type: custom' >> config/elasticsearch.yml
$ echo 'index.analysis.analyzer.default.tokenizer: kuromoji_tokenizer' >> config/elasticsearch.yml
```

### `_analyze` を使用して解析する

```sh
$ curl -XGET "localhost:9200/_analyze?analyzer=kuromoji&pretty" -d "こんにちわ、世界" 
{
  "tokens" : [ {
    "token" : "こんにちわ",
    "start_offset" : 0,
    "end_offset" : 5,
    "type" : "word",
    "position" : 1
  }, {
    "token" : "世界",
    "start_offset" : 6,
    "end_offset" : 8,
    "type" : "word",
    "position" : 2
  } ]
}
```

`_analyze?analyzer=kuromoji" -d "こんにちわ、世界"` というリクエストを送信すればそれだけで解析してくれます。
非常に簡単に日本語を分解してくれる良い奴ですが、できれば品詞の情報も欲しいですね。まぁ、それはしょうがないということにしましょう。


## おまけ：品詞分解したい場合

あるエンドポイントで形態素解析で品詞分解したいのならば [elasticsearch-extended-analyze](https://github.com/johtani/elasticsearch-extended-analyze) を使用しましょう。

インストールすれば下記のように使用できます。（サンプルより）

```sh
curl -XPOST 'localhost:9200/_extended_analyze?pretty' -d '
{
  "tokenizer" : "kuromoji_tokenizer",
  "filters" : ["kuromoji_baseform"],
  "text" : "寿司が美味しかった",
  "use_short_attr" : true,
  "attributes" : ["BaseFormAttribute", "PartOfSpearchAttribute", "ReadingAttribute"]
}'
```

## おまけ：Elasticsearch以外の形態素解析サーバが欲しい場合

Elasticsearchでもよいですが、それ以外でしたらGo言語でかかれた形態素解析用のサーバアプリがあります。

[ikawaha/kagome - Kagome Japanese Morphological Analyzer](https://github.com/ikawaha/kagome)

kagomeはKuromojiベースの形態素解析が可能です。Goをやっている方で形態素解析をしたい方にはおすすめです。

なかなか使用感は非常によいですが、辞書のロードでメモリを喰うため、共有メモリとして辞書をロードするようにしましょう。

## おわりに

Elasticsearchはログ解析用の記事が多い気がしますが、いろいろ着眼点を変えれば使用できる機会が多くなります。

また、自分でプラグインを作成することも可能なので、アプリケーションロジックでなく、Elasticsearch側にロジックを含めてしまうことも簡単なのです。

今後はそっちをどんどんやっていこうかなと密かに思っていたりします。