luceneで日本語のインデックスを作る

lucene

Java全文検索エンジンLuceneは残念なことにディフォールトでは日本語(のインデックス作成)に対応していない。これは日本語に対応したAnalizer/Tokenizer(文章を単語などの小さい単位に切り出すもの)が無いためで、調べて見るとすでに2つのAnalizer/Tokenizerが公開されていて、それぞれに短所・長所がある様子。


CJKAnalizer

CJKAnalizerはLuceneのサブプロジェクトで、Lucene Sandbox(Luceneに対する色々な拡張を集めたもの)に入っている。ファイル2つだけなので、CVSから直接取ってくるといい。http://cvs.apache.org/viewcvs.cgi/jakarta-lucene-sandbox/contributions/analyzers/src/java/org/apache/lucene/analysis/cjk/


このCJKAnalizerはCJK文字を見つけるとN-gram式でインデックスを作るために切り出し、それ以外(英語など)は単語ごとに切り出す。良くも悪くもN-gram方式なので、、、


長所としては、、、

  • 単語のヒット率が高い
  • シンプルで速い。


短所としては、、、

  • インデックスが大きくなる。
  • ファジーサーチ(Fuzzy Searches)やレンジサーチ(Range Searches)が使えない。


Sen

Sen(http://yamaguch.sytes.net/~tora/opensource/sen/
)はC++形態素解析エンジンmecabhttp://chasen.org/~taku/software/mecab/)をJavaに移植した物。これは形態素解析をしているので、、、


長所としては、、、

  • インデックスが小さい。
  • ファジーサーチ(Fuzzy Searches)やレンジサーチ(Range Searches)が使える。


短所としては、、、

  • 多少遅い。特に初期化。(注:Ver0.44でテスト時。1.0では速くなっているらしい)
  • 単語のヒット率がN-gram方式よりは低い(しかし通常十分実用にはなる)


どちらがいいか?

どちらが良いかは一概に言えない様子。(ポピュラーな全文検索エンジンNamazuでも、KakasiがいいかChasenがいいか意見が分かれている模様。http://www.namazu.org/FAQ.html#kakasi-or-chasen


僕のプロジェクトではとりあえず、検索結果が多少よかったので、CJKAnalizerを使っていますが、将来的にクラスター分析などができないかと考えているので、その時にはSenに移行する必要がありそうです。