今までは検索時にStandardTokenizerFactoryを使って、
その後NGramFilterFactoryでNGramに分割してたんだけど、
それだと検索の精度がいまいちだということに、Twitterのbot君を見てて思ったわけですね。

たとえば、以前は
ty250と検索すると、見たくも無いのにmajesty250やら、bolty250やらが出てくるというお粗末な結果だったわけです。

それの原因は、すべてをNGramの対象としていたため、キーワードが一致するものはすべて出力するようになっていたというわけ。

これを一週間ぐらいずっと考えてた。 どうするかなーって。
結論
英字、数字、日本語、その他に分けて
分けたトークンがすべて一致すれば、そのバイクを出力すればいいと思いついた!

例を出すと
Z250というバイクと、GPZ250というバイクがあるとする。
これを上記方法でトークンに分割すると
Z250 => [Z], [250]
GPZ250 => [GPZ], [250]
こうなる。

この場合、250と検索すると両方出力されるが
Zと検索すると、Z250しか検索されず、さらにGPZと検索するとGPZ250しか出ないというわけ。
※PとかGのみの検索だと何もでない点に注意。


これを実現するためにすごい時間を費やしてしまった。。。
まず一番に考えたのは、solrのトークナイザーファクトリーを自作

3日がんばったけど、テストプログラムすら作れなかったため断念。

で探した結果
ありました。「PatternTokenizerFactory」
これは正規表現でトークンに分けてくれるという、もうすばらしい代物!

で早速実験成功したので、本番に組み込む!


本番に組み込む際に、なぜかsolrが立ち上がらないというアクシデントもありましたが(solrconfig.xmlのクラスパスが間違ってました。。。 開発環境と本番環境で違うから注意しなきゃ。。。)

ちょっとバグも多々見つかりつつある状態ですが、検索精度が大幅に上がったのではないかと思います。

バグ等見つけた方は、ご連絡お願いします。

ばいくさーちどっとじぇーぴー

あ、あとツイッターのつぶやきの指定を緩くしてみました。
今までは100件以上だったのを、10件以上にしたので
今まで以上にいろいろなバイクがつぶやかれるかもです。(検索されれば)