ElasticSearch で kuromoji を使う (ES 0.90.Beta1 + kuromoji 1.2.0篇)

More than 5 years have passed since last update.

なんか ES + kuromoji の使い方のドキュメントが古かったりしたので防備録。ES 0.90.Beta1 + kuromoji 1.2.0 の話しです。なおこの情報もすぐ古くなるかもしれないので注意な!


インストール

適当に

brew install https://gist.github.com/hotchpotch/5133549/raw/bdeea58fa72c33f74131f27ec78758556182d7ba/elasticsearch.rb

/usr/local/opt/elasticsearch/bin/plugin -install elasticsearch/elasticsearch-analysis-kuromoji/1.2.0


kuromoji

各種インターネッツのドキュメントには analyzer や tokenizer を analysis で指定してますが、ソースコードを見ると必要はありません。

module.addAnalyzer("kuromoji", KuromojiAnalyzerProvider.class);

module.addTokenizer("kuromoji_tokenizer", KuromojiTokenizerFactory.class);
module.addTokenFilter("kuromoji_baseform", KuromojiBaseFormFilterFactory.class);
module.addTokenFilter("kuromoji_part_of_speech", KuromojiPartOfSpeechFilterFactory.class);
module.addTokenFilter("kuromoji_readingform", KuromojiReadingFormFilterFactory.class);
module.addTokenFilter("kuromoji_stemmer", KuromojiKatakanaStemmerFactory.class);

と plugin ですでに kuromoji という analyzer, kuromoji_tokenizer という tokenizer が指定してあります。そのため別途 analysis を指定する必要はありません。

$ curl -XPUT 'localhost:9200/kuromoji_checker/' -d '{}'

{"ok":true,"acknowledged":true}
$ curl -XGET 'localhost:9200/kuromoji_checker/_analyze?analyzer=kuromoji&pretty' -d '関西国際空港'
{
"tokens" : [ {
"token" : "関西",
"start_offset" : 0,
"end_offset" : 2,
"type" : "word",
"position" : 1
}, {
"token" : "関西国際空港",


ハマったところ

index の mapping で analyzer を指定するとき、すべての analyzer に kuromoji 指定してない場合、検索クエリで match:_all 的なクエリを発行するときに、日本語だけ引っかからない現象が発生します。



- body は analyzer: 'kuromoji'

- created_at は analyzer 指定無し

この場合、match:_all なクエリで 'hello' のような場合は引っかかりますが、'こんにちは' では引っかかりません。対処法としては、default の analyzer を kuromoji に指定するか、match で適切に match: body のように設定する必要があります。