elasticsearch での Kuromoji の使い方
前回インストールした elasticsearch で日本語形態素解析器 Kuromoji を使ってみます。
環境は CentOS 6.3、elasticsearch 0.20.5 です。
elasticsearch はプラグインで機能を拡張できるようです。
利用可能なプラグインは公式サイトの以下のページにまとめられていました。
elasticsearch - guide - Plugins
http://www.elasticsearch.org/guide/reference/modules/plugins.html
今回は Kuromoji を使うため、上記ページの「Analysis Plugins」内にあった「Japanese (Kuromoji) Analysis plugin (by elasticsearch team)」を入れてみました。
elasticsearch/elasticsearch-analysis-kuromoji
https://github.com/elasticsearch/elasticsearch-analysis-kuromoji
elasticsearch-analysis-kuromoji プラグインの README.md を見ると、今回使っている elasticsearch 0.20.5 では 1.1.0 を使えばいいようです。
elasticsearch インストールディレクトリに移動し、以下のように付属の plugin コマンドを使用してインストールします。
# cd /usr/local/elasticsearch # bin/plugin -install elasticsearch/elasticsearch-analysis-kuromoji/1.1.0 -> Installing elasticsearch/elasticsearch-analysis-kuromoji/1.1.0... Trying http://download.elasticsearch.org/elasticsearch/elasticsearch-analysis-kuromoji/elasticsearch-analysis-kuromoji-1.1.0.zip... Downloading ..................................................................................................................................DONE Installed analysis-kuromoji
これでプラグインのインストールが完了しました。
追加したプラグインを有効にするために elasticsearch を再起動します。
# service elasticsearch restart
インストールはしたものの、どうも使い方のドキュメントが見当たりません。
しばらく試行錯誤した結果、plugin のテストケース内にあった kuromoji_analysis.json にそれらしき記述があったので、そちらを真似して以下のように index を作成してみました。
# curl -XPUT 'http://localhost:9200/test/' -d ' { "index":{ "analysis":{ "filter":{ "kuromoji_rf":{ "type":"kuromoji_readingform", "use_romaji" : "true" }, "kuromoji_pos" : { "type": "kuromoji_part_of_speech", "enable_position_increment" : "false", "stoptags" : ["# verb-main:", "動詞-自立"] }, "kuromoji_ks" : { "type": "kuromoji_stemmer", "minimum_length" : 6 } }, "tokenizer" : { "kuromoji" : { "type":"kuromoji_tokenizer" } }, "analyzer" : { "kuromoji_analyzer" : { "type" : "custom", "tokenizer" : "kuromoji_tokenizer" } } } } }'
プラグインが正常にインストールされていない場合はここでエラーになります。
上記を実行して「{"ok":true,"acknowledged":true}」という結果が返ってくればプラグインは正常にインストールされています。
まずはデフォルトの Analyzer でどのように単語が解析されるかを見てみます。
# curl -XGET 'http://localhost:9200/test/_analyze?pretty=true' -d '東京都目黒区' { "tokens" : [ { "token" : "東", "start_offset" : 0, "end_offset" : 1, "type" : "<IDEOGRAPHIC>", "position" : 1 }, { "token" : "京", "start_offset" : 1, "end_offset" : 2, "type" : "<IDEOGRAPHIC>", "position" : 2 }, { "token" : "都", "start_offset" : 2, "end_offset" : 3, "type" : "<IDEOGRAPHIC>", "position" : 3 }, { "token" : "目", "start_offset" : 3, "end_offset" : 4, "type" : "<IDEOGRAPHIC>", "position" : 4 }, { "token" : "黒", "start_offset" : 4, "end_offset" : 5, "type" : "<IDEOGRAPHIC>", "position" : 5 }, { "token" : "区", "start_offset" : 5, "end_offset" : 6, "type" : "<IDEOGRAPHIC>", "position" : 6 } ] }
一文字ずつに分割されてしまっています。
次に Analyzer として、追加した kuromoji_analyzer を指定して実行してみます。
# curl -XGET 'http://localhost:9200/test/_analyze?pretty=true&analyzer=kuromoji_analyzer' -d '東京都目黒区' { "tokens" : [ { "token" : "東京", "start_offset" : 0, "end_offset" : 2, "type" : "word", "position" : 1 }, { "token" : "都", "start_offset" : 2, "end_offset" : 3, "type" : "word", "position" : 2 }, { "token" : "目黒", "start_offset" : 3, "end_offset" : 5, "type" : "word", "position" : 3 }, { "token" : "区", "start_offset" : 5, "end_offset" : 6, "type" : "word", "position" : 4 } ] }
「東京」や「目黒」がちゃんと単語として認識されていることがわかります。
新しい index を作成する度に毎回 Analyzer を指定するのも面倒なので、デフォルトで Kuromoji を使うよう設定してみます。
その前に先ほどテスト用に作成した index を削除しておきます。
# curl -XDELETE 'http://localhost:9200/test' {"ok":true,"acknowledged":true}
設定ファイルを編集します。
# vi /usr/local/elasticsearch/config/elasticsearch.yml
以下を追記してください。
index.analysis.analyzer.default.type: custom index.analysis.analyzer.default.tokenizer: kuromoji_tokenizer
追記したら elasticsearch を再起動。
# service elasticsearch restart
今度は以下のように特に Analyzer の指定はせずに index を作成してみます。
# curl -XPUT 'http://localhost:9200/test/' {"ok":true,"acknowledged":true}
Analyzer を指定せずに実行します。
# curl -XGET 'http://localhost:9200/test/_analyze?pretty=true' -d '東京都目黒区' { "tokens" : [ { "token" : "東京", "start_offset" : 0, "end_offset" : 2, "type" : "word", "position" : 1 }, { "token" : "都", "start_offset" : 2, "end_offset" : 3, "type" : "word", "position" : 2 }, { "token" : "目黒", "start_offset" : 3, "end_offset" : 5, "type" : "word", "position" : 3 }, { "token" : "区", "start_offset" : 5, "end_offset" : 6, "type" : "word", "position" : 4 } ] }
最初に Analyzer を指定して index を作成した時と同様の結果が得られました。
これでデフォルトで Kuromoji を使う事が出来るようになったようです。
ちなみに最初に参考にした kuromoji_analysis.json に書いてあるのと同じ設定も以下のように設定ファイルに書く事が出来ます。
それぞれの設定項目の意味などはまだ全然分かっていませんが・・・。
index: analysis: filter: kuromoji_rf: type: kuromoji_readingform use_romaji: true kuromoji_pos: type: kuromoji_part_of_speech enable_position_increment: false stoptags: ["# verb-main:", "動詞-自立"] kuromoji_ks: type: kuromoji_stemmer minimum_length: 6 tokenizer: kuromoji: type: kuromoji_tokenizer analyzer: default: type: custom tokenizer: kuromoji_tokenizer
日本語が入っているため、設定ファイルを保存する際には UTF-8 で保存することをお忘れなく。
細かい設定などはまだ全然見れてませんが、取りあえずこれで日本語のドキュメントを検索できそうです。
これからいろいろと試してみたいと思います。