編集長の佐藤(http://cocky.exblog.jp/)です。
最近勉強会ネタでブログが埋まっているので、たまにはそれ以外のネタで。
最近某クライアント様の要望でサーチのカスタマイズ(NaviPlusサーチはASPなので通常カスタマイズはやらないんですけど、専用サーバプランの場合には追加の開発費用を頂いてカスタマイズを行うことがあります)を行った際の話です。
検索結果の精度を上げるために、どうしてもSolrのCharFilterを独自実装する必要が出てきて、コーディング自体はさくっと終わったんですが、いざ使ってみると、通常の検索(Bi-gramによる中間一致検索)の場合は全く問題ないのに、サジェスト候補の検索(ワイルドカードを使った前方一致検索)ではCharFilterが動かないという事象が発生。
ワイルドカードを使わなければCharFilterが普通に動作するので、SolrのQueryの書き方の問題とかいろいろ調べたところ、実は
- Solr 4.0以降ではanalyzerのtypeとして「index」「query」以外に「multiterm」が追加されている
- ワイルドカード検索を使う場合はtypeとして「multiterm」が選択される
- 「multiterm」の時は、CharFilterFactoryクラスでMultiTermAwareComponentをimplementしておかないと、そのCharFilterはスキップされる
ということが判明(詳しくはMultitermQueryAnalysisあたりを参照)。
MultiTermAwareComponentのimplementation自体はそんなに難しくなかったので(LowerCaseFilterFactoryあたりのソースを参考にするとわかりやすい)、
急いでソースを修正して対応しましたが、これなかなか気づかないよなぁ、と思った次第で。