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

文系プログラマによるTIPSブログ

文系プログラマ脳の私が開発現場で学んだ事やプログラミングのTIPSをまとめています。

solr3.6のkuromojiで同義語を設定

solr

solr3.6、ついにリリースされましたね。
solr3.6になって、atilikaが作っている、
日本語形態素解析機である「kuromoji」が標準搭載される事になりました。
比較的新しく、pure javaなので、senやgosenではなくkuromojiを使っていくといいかと思います。
lucene-gosenもいいですが、やはり標準搭載を使って行きたい)

早速synonym(同義語)の設定をしてみます。
field_typeがtext_jaのものが、kuromojiによる形態素の設定のようです。
まずはanalyzerの設定を、queryとindexに分けます。

    <fieldType name="text_ja" class="solr.TextField" positionIncrementGap="100" autoGeneratePhraseQueries="false">
      <analyzer type="index">
        <tokenizer class="solr.JapaneseTokenizerFactory" mode="search"/>
        <filter class="solr.JapaneseBaseFormFilterFactory"/>
        <filter class="solr.JapanesePartOfSpeechStopFilterFactory" tags="lang/stoptags_ja.txt" enablePositionIncrements="true"/>
        <filter class="solr.CJKWidthFilterFactory"/>
        <filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_ja.txt" enablePositionIncrements="true" />
        <filter class="solr.JapaneseKatakanaStemFilterFactory" minimumLength="4"/>
        <filter class="solr.LowerCaseFilterFactory"/>
      </analyzer>
      <analyzer type="query">
        <tokenizer class="solr.JapaneseTokenizerFactory" mode="search"/>
        <filter class="solr.JapaneseBaseFormFilterFactory"/>
        <filter class="solr.JapanesePartOfSpeechStopFilterFactory" tags="lang/stoptags_ja.txt" enablePositionIncrements="true"/>
        <filter class="solr.CJKWidthFilterFactory"/>
        <filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_ja.txt" enablePositionIncrements="true" />
        <filter class="solr.JapaneseKatakanaStemFilterFactory" minimumLength="4"/>
        <filter class="solr.LowerCaseFilterFactory"/>
      </analyzer>
    </fieldType>

次に、「solr.SynonymFilterFactory」をindexとqueryの両方に追加します。

        <tokenizer class="solr.JapaneseTokenizerFactory" mode="search"/>
        <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
        <filter class="solr.JapaneseBaseFormFilterFactory"/>

そして、synonyms.txtに適当に「kuromoji,形態素解析」等と書いて、tomcatを起動します。
analysisのページで同義語を試してみましょう。
f:id:treeapps:20120502014647p:image
あれ?検索にヒットしない。SynonymFilterFactoryが効いてないのか???

まさかとは思うが、SynonymFilterFactoryって、デフォルトのトークナイザが「solr.StandardTokenizerFactory」なのか?
試しにトークナイザを指定してみる。

<filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
↓こう編集
<filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true" tokenizerFactory="solr.JapaneseTokenizerFactory"/>

f:id:treeapps:20120502015144p:image
キターーー!
どうやらtokenizerFactoryでsolr.JapaneseTokenizerFactoryを指定してやると動くようです。
本当にこれで正しいのだろうか。solr wikiにも書いてないし、合ってる自信無いですが、
動いたので良しとします・・

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

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