Elasticsearch に kuromoji を入れて日本語全文検索をする

デフォルトの状態だと対応していない日本語全文検索を、kuromoji を入れることで対応させます。
Elasticsearch のインストールについては[コチラ](http://qiita.com/mserizawa/items/c1c04fa9b2f85c437334)を参考にしてください。

## kuromoji のインストール

Elasticsearch には `plugin` というコマンドが用意されていて、これを使うことで簡単に各種プラグインをインストールできます。

今回は[コチラ](https://github.com/elastic/elasticsearch-analysis-kuromoji)のプラグインを入れてみます。
インストール済みの Elasticsearch のバージョンが 1.5.2 ですので、プラグインのバージョンは 2.5.0 を指定します。

```bash
$ bin/plugin install elasticsearch/elasticsearch-analysis-kuromoji/2.5.0
```

インストールしたプラグインの一覧は [Nodes Info を取得する API](http://www.elastic.co/guide/en/elasticsearch/reference/current/cluster-nodes-info.html) を使って確認できます。 

Elasticsearch を起動して、以下のリクエストを投げましょう。

```bash
$ curl -X GET 'http://localhost:9200/_nodes/plugins'
```

```json
{
    "cluster_name": "elasticsearch",
    "nodes": {
        "ySfOpEusSI6E6KJ6WF14Vg": {
            ...
            "plugins": [
                {
                    "name": "analysis-kuromoji",
                    "version": "2.5.0",
                    "description": "Kuromoji analysis support",
                    "jvm": true,
                    "site": false
                }
            ]
        }
    }
}
```

ちゃんとインストールされているみたいですね。

kuromoji をデフォルトのトークナイザとして利用するよう、設定ファイルを書き換えておきましょう。

`config/elasticsearch.yml` に以下の設定を追記します。

```yaml
index.analysis.analyzer.default.type: custom
index.analysis.analyzer.default.tokenizer: kuromoji_tokenizer
```

追加箇所はどこでもいいのですが、せっかくなので Index に関する設定（92行目〜）あたりが良いと思います。

追記が完了したら Elasticsearch を再起動してください。

## 日本語データの投入

ひとまずスキーマレスで日本語データを入れてみます。
Wikipedia の [ワイン用ブドウ品種の一覧](http://ja.wikipedia.org/wiki/%E3%83%AF%E3%82%A4%E3%83%B3%E7%94%A8%E3%83%96%E3%83%89%E3%82%A6%E5%93%81%E7%A8%AE%E3%81%AE%E4%B8%80%E8%A6%A7) から抜粋したワインの説明を使います。

Elasticsearch の [Bulk API](http://www.elastic.co/guide/en/elasticsearch/reference/current/docs-bulk.html) を使って、一度に複数のデータを登録します。

まずは以下のような JSON データを用意します。

```json:wine.json
{ "index" : {} }
{ "name": "カベルネ・ソーヴィニヨン", "description": "カベルネ・ソーヴィニヨン (Cabernet Sauvignon) は、世界的に最も有名な赤ワイン用の代表ワイン用品種の1つである。単に「カベルネ」(Cabernet) とも呼ばれることが多い。フランスではメドック地区に代表されるようにボルドーの最も重要な品種の一つであり、世界各地でも栽培されているが、比較的温暖な気候を好む。ソーヴィニヨン・ブランとカベルネ・フランの自然交配によって誕生したといわれている。 果皮のタンニン分が多く、強い渋味のある濃厚なワインとなる。雑味が多く、比較的長期の熟成を必要とする。強過ぎる渋味を緩和すべく、メルロー等の他の品種との混醸や混和も少なくない。歴史的には「ヴィドゥーレ」「ヴェデーレ」（「硬い」の意）とも呼ばれた。ソーヴィニヨン・ブラン同様メトキシピラジン(Methoxypyrazine)に由来するアロマがある。"}
{ "index" : {} }
{ "name": "メルロー", "description": "メルロー (Merlot) は、赤ワイン用の品種の中では最大の作地面積をもつ。とくにフランスのボルドーや、それを真似た「ボルドー・ブレンド」において非常に重要であり、カベルネ・ソーヴィニヨンとブレンドされることもある。カベルネ・ソーヴィニヨンに比し爽やかで、軽口である。また、ボルドーのサンテミリオン(Saint-Emilion)やポムロール(Pomerol)といった地区では、カベルネ・ソーヴィニヨンよりも多く配合され、とくにポムロール地区の「シャトー・ペトリュス」は、しばしばこの品種単独で造られる。日本でも長野県の塩尻市桔梗ヶ原地区などで栽培されている。土壌の塩分に弱い。"}
{ "index" : {} }
{ "name": "ピノ・ノワール", "description": "ピノ・ノワール (Pinot Noir) は、フランスのブルゴーニュ地方を原産とする世界的な品種で、紫色を帯びた青色の果皮を持つ。冷涼な気候を好み、特に温暖な気候では色やフレーバーが安定しないので栽培は難しい。イタリアでは「ピノ・ネロ」(Pinot Nero)、ドイツでは「シュペートブルグンダー」(Spätburgunder)の名がある。遺伝子的に不安定で変異種が少なくない。この中には、緑みを帯びた黄色の果皮を持つピノ・ブラン(Pinot Blanc)や褐色のピノ・グリ(Pinot Gris)などがあり、時には同じ樹に異なった色の果実がなるともいわれている。フランス以外では最近ニュージーランドでの栽培が盛んで、寒冷地を中心に栽培される。ワインはライトボディで、弱めの渋味、繊細なアロマとフレーバーが特徴である。シャンパンにも欠かせない品種である。"}
{ "index" : {} }
{ "name": "シラー", "description": "シラー(Syrah)は「シラーズ」(Shiraz)とも呼ばれる赤ワイン用の代表的な品種の1つである。シラーズはイランの都市名であるが、フランス・ローヌ地方が起源とされる。ローヌ地方の代表的な品種である他、オーストラリアでは最も重要な品種である。南アフリカ、チリなどでも栽培されている。ワインはフルボディで香味が強く、カベルネ・ソーヴィニヨンに比べタンニンが「新鮮」なのが特徴である。他の品種との混醸や混和も見られる。栽培される気候や風土によって味が異なる。ローヌ渓谷北部のコート・ロティやエルミタージュ、オーストラリア産が有名。果実は熟するとしなびやすい。"}
{ "index" : {} }
{ "name": "サンジョヴェーゼ", "description": "サンジョヴェーゼ (Sangiovese) は、イタリアで最も栽培面積の多い赤ワイン用の品種である。果皮の色の違いを含め数多くの亜種を持つ。中央イタリアのトスカーナ州が主産地で、イタリアで最も有名な一つである「キャンティ(Chianti)をはじめ、「ブルネッロ・ディ・モンタルチーノ」(Brunello di Montalcino) や「ヴィーノ・ノービレ・ディ・モンテプルチアーノ」(Vino Nobile di Montepulciano) 、「モレッリーノ・ディ・スカンサーノ」(Morellino di Scansano)などが生産される。コルシカ島では、「ニエルッキオ」(Nielluccio)として知られる。"}
```

これを API に食わせます。

```bash
$ curl -X POST http://localhost:9200/wine/sample/_bulk --data-binary @wine.json
```

これでデータの投入が完了です。

## データの検索

早速全文検索を試してみましょう。
「渋め」という言葉で検索してみます。

```bash
$ curl -X GET http://localhost:9200/wine/sample/_search -d '{"query":{"match":{"description":"渋め"}}}'
```

```json
{
    ...
    "hits": {
        "total": 2,
        "max_score": 0.0039781863,
        "hits": [
            {
                "_index": "wine",
                "_type": "sample",
                "_id": "AU05dEjJWi5hr7X277ff",
                "_score": 0.0039781863,
                "_source": {
                    "name": "カベルネ・ソーヴィニヨン",
                    "description": "カベルネ・ソーヴィニヨン (Cabernet Sauvignon) は、世界的に最も有名な赤ワイン用の代表ワイン用品種の1つである。単に「カベルネ」(Cabernet) とも呼ばれることが多い。フランスではメドック地区に代表されるようにボルドーの最も重要な品種の一つであり、世界各地でも栽培されているが、比較的温暖な気候を好む。ソーヴィニヨン・ブランとカベルネ・フランの自然交配によって誕生したといわれている。 果皮のタンニン分が多く、強い渋味のある濃厚なワインとなる。雑味が多く、比較的長期の熟成を必要とする。強過ぎる渋味を緩和すべく、メルロー等の他の品種との混醸や混和も少なくない。歴史的には「ヴィドゥーレ」「ヴェデーレ」（「硬い」の意）とも呼ばれた。ソーヴィニヨン・ブラン同様メトキシピラジン(Methoxypyrazine)に由来するアロマがある。"
                }
            },
            {
                "_index": "wine",
                "_type": "sample",
                "_id": "AU05dEjJWi5hr7X277fh",
                "_score": 0.0028130026,
                "_source": {
                    "name": "ピノ・ノワール",
                    "description": "ピノ・ノワール (Pinot Noir) は、フランスのブルゴーニュ地方を原産とする世界的な品種で、紫色を帯びた青色の果皮を持つ。冷涼な気候を好み、特に温暖な気候では色やフレーバーが安定しないので栽培は難しい。イタリアでは「ピノ・ネロ」(Pinot Nero)、ドイツでは「シュペートブルグンダー」(Spätburgunder)の名がある。遺伝子的に不安定で変異種が少なくない。この中には、緑みを帯びた黄色の果皮を持つピノ・ブラン(Pinot Blanc)や褐色のピノ・グリ(Pinot Gris)などがあり、時には同じ樹に異なった色の果実がなるともいわれている。フランス以外では最近ニュージーランドでの栽培が盛んで、寒冷地を中心に栽培される。ワインはライトボディで、弱めの渋味、繊細なアロマとフレーバーが特徴である。シャンパンにも欠かせない品種である。"
                }
            }
        ]
    }
}
```

「渋味」というワードを含むものが検索されました。
「渋め」という言葉が分かち書きされて検索されていることが分かりますね。

ちなみに、どのように分かち書きされるかは以下のリクエストで確認できます。

```bash
$ curl -X GET "http://localhost:9200/wine/_analyze" -d "渋め"
```

```json
{
    "tokens": [
        {
            "token": "渋",
            "start_offset": 0,
            "end_offset": 1,
            "type": "word",
            "position": 1
        },
        {
            "token": "め",
            "start_offset": 1,
            "end_offset": 2,
            "type": "word",
            "position": 2
        }
    ]
}
```