こないだTomcat7にSolr3.5をインストールしてみましたが、 今回は検索の精度を高めると言いますか、 - 要らんのが検索で引っかからないように取り除いて、 - 意図が同じなのは検索で引っかかるようにする。 なんていう事をしてみようと思います。 ■ StopFilter stopwords_ja.txtでは以下のようにいれてみました。
# Standard english stop words taken from Lucene's StopAnalyzer する ます た だ です ある いる は を 。 、
schema.xmlは、、
<fieldType name="text_ja" class="solr.TextField" positionIncrementGap="100"> <analyzer> <tokenizer class="solr.JapaneseTokenizerFactory"/> <filter class="solr.StopFilterFactory" words="stopwords_ja.txt"/> </analyzer> </fieldType>
"私は眠いです。"とかってのを食わせてやると、 "私" "眠い" ってなってくれたりしてイイ感じです。 他に要らないのを食わないようにするために、POSFilterFactoryっていうフィルタを使って pos-deny.txtに定義した特定の品詞を食わないように出来たりします。 ■ JapaneseBasicFormFilter 曲名が"会いたかった" なのか "会いたい" なのか、、みたいな歌を検索したいとします。 んま、どっち入れても引っかかって欲しいですよね、と。 schema.xmlは、さっきのstopとあわせて↓以下のように設定します。
<fieldType name="text_ja" class="solr.TextField" positionIncrementGap="100"> <analyzer> <tokenizer class="solr.JapaneseTokenizerFactory"/> <filter class="solr.StopFilterFactory" words="stopwords_ja.txt"/> <filter class="solr.JapaneseBasicFormFilterFactory"/> </analyzer> </fieldType>
以下のように"会いたかった"でインデクシングして、"会いたい"で検索したとします。 結果は"会う"と"たい"でマッチしました。 "たい"の助動詞はPOSFilterで落としちゃってもイイかなぁというような気がしますが、 とりあえずやりたかった事は出来ました。 ■ SynonymFilter "マクドナルド"の事を、関西の人は"マクド"って言ったり、関東の人は"マック"って言ったりしますが、 どれでも、引っかかって欲しいところだと思います。 あとは、"Google"と"グーグル"って同じ事指してるよね、と。 synonyms-ja.txtに以下のように書きこんで、 (マクドナルドは展開。Googleは寄せる。)
マクドナルド, マック, マクド Google => グーグル
schema.xmlは更に追記する感じで、synonyms-ja.txtを指定してやります。
<analyzer> <tokenizer class="solr.JapaneseTokenizerFactory"/> <filter class="solr.StopFilterFactory" words="stopwords_ja.txt"/> <filter class="solr.JapaneseBasicFormFilterFactory"/> <filter class="solr.SynonymFilterFactory" synonyms="synonyms-ja.txt"/> </analyzer>
あんまり良い例か分かりませんが、"Google"と"マクドナルド"という単語が入った文字列をインデクシングして、 "グーグル マック"というキーワードで検索してみます。 結果は狙ったように↓検索出来ました。 他にも、カタカナの最後の"ー"を取るとか、ケースインセンティブにするとか、 追加すべきフィルタはチョコチョコありますが、基本的には上記のような感じで試しながらやってみる、と。 ただ、一回インデクシングしちゃった後に、ファイルに何か足すとかなると、もう一回インデックス作りなおしかよ的な 感じになってしまうところもあったりして、運用も想定した上で構築していかなきゃならんなぁと。 にしても、ほんとSolr使いには↓バイブルだな…。