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++の形態素解析エンジンmecab(http://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に移行する必要がありそうです。