akishin999の日記

調べた事などを書いて行きます。

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 で保存することをお忘れなく。

細かい設定などはまだ全然見れてませんが、取りあえずこれで日本語のドキュメントを検索できそうです。
これからいろいろと試してみたいと思います。


ElasticSearch Server
ElasticSearch Server
posted with amazlet at 13.06.05
Packt Publishing (2013-02-21)