読者です 読者をやめる 読者になる 読者になる

Apache Solrでbigram日本語全文検索

現在稼働中のあるシステムはmysql+tritonnによる日本語全文検索を行っているのですが、更新にあたり、すでにメンテが止まったtritonnの代替として以下の候補が挙がっています。

  1. Apache Solr
  2. mroonga

mroongaはtritonnの後継プロジェクトで、mysqlのプラグインとして動作するので移行の手間があまりかからない上、現在の運用管理に及ぼす影響もあまりないというメリットがあるんですが、せっかくなので両方検証環境をつくって動作比較などしています。mroongaはさくっと構築が終わったんですが、Apache Solrは設定の仕方から調べていたので時間がかかりました。Javaサーブレットコンテナもよく分からないし。

トークナイズ方式は前システムを踏襲しbigramで、英単語や数字の部分一致もできるもの。CJKTokenizerFactoryは使えないのでどうすりゃいいのよということで調べて見ると下記サイトにたどり着く。

http://moyolab.blog57.fc2.com/blog-entry-90.html

WhiteSpaceTokenizerとLowerCaseFilterFactoryとNGramFilterFactoryを組み合わせたAnalyzerです。さっそくこれでインデックスしたところ、最初は現システムやmroongaの検索結果と同じになってるー!と喜んでいたんですが、試しているうちに検索語によって数十件程度ずれることがあるのが判明(文書数は1千万くらい)。その原因を突き止めるのにめちゃめちゃ時間がかかった・・・。結論から言えば、WhiteSpaceTokenizerは1トークンの最大長が255文字になっているのが原因のようです。256字以上の文章で、文章中に空白が存在しない場合、255字でトークン分割され、それぞれのトークンに対してさらにbigramで分割されます。そのときに何が起こるか、下の状況を例とします。

  • 254字目が北
  • 255字目が海
  • 256字目が道

 

 「北海道」が「北海」と「道」で分断されてしまうので、「北海道」と検索しても引っかからなくなってしまうわけです。「北海」では引っかかるんですけどね。

Solrwikiを読んで見た限りでは、WhiteSpaceTokenizerではトークンの最大長を設定するオプションはないみたいです。StandardTokenizerとかにはあるのに何で。。。?

結局WhiteSpaceTokenizerではなくKeywordTokenizerを使うことで解決しました。

 

 

 Apache Solrは最新verが4.xなんですが、過去のverでは設定できたオプションが結構利用できなくなっています。schema.xmlの中に注意書きはあるんですけどね。。。結構皆さん「Apache Solr 入門」という本を買ってる方も多いと思うんですが、ver1.6をベースに書かれているので、内容が最新verにも全て一致する、というわけではありません。といっても非常に有用な情報が載っているのでありがたく読ませていただいております。最新verベースのも出版される予定はないんでしょうか。

 

Apache Solr入門 ―オープンソース全文検索エンジン

Apache Solr入門 ―オープンソース全文検索エンジン