Apache Solr 4.4 日本語用設定

Solr に Amazon商品データを登録して色々と試したのだけど、検索キーに対して結果が想定と微妙に異なることがあった。fieldType の設定はデフォルトのまま流用したのだけど、やはりちゃんと理解したうえで調整も必要なのだろう、ということで設定について調査している。(Web上には色々と情報も出ているがまとめとかないと、また後でやるときが面倒)徐々に書き足す予定。

※ 2013/09/04 共通設定を分離

共通設定

N-GRAM形態素解析の両方で使える設定をまとめる。

種別 class 説明 オプション 参考
charFilter solr.MappingCharFilterFactory マッピングファイルに書かれたルールに従って文字を変換する。 mapping=mapping-ja.txt Mapping CharFilterFactoryの使い方
charFilter solr.PatternReplaceCharFilterFactory 正規表現で指定されたパターンに沿って文字を変換する。 pattern="([^a-z])" replacement="" Pattern ReplaceCharFilterFactoryの使い方
charFilter solr.HTMLStripCharFilterFactory テキストからHTMLタグを取り除く。 solr.HTMLStripCharFilterFactory
filter solr.LowerCaseFilterFactory 英大文字を小文字に変換する。 solr.LowerCaseFilterFactory
filter solr.CJKWidthFilterFactory 全角ASCII文字を半角に、半角カタカナを全角に変換する。solr.MappingCharFilterFactoryでこの手の変換を記述する必要は無いと言うことになる。 CJKWidthFilterFactory
filter solr.SynonymFilterFactory 類義語の展開と設定をおこなう。類義語定義の書式は参考のページに詳細が記述してある。 synonyms="syn.txt" ignoreCase="true" expand="false" solr.SynonymFilterFactory, solrの同義語の設定, kuromojiの辞書のメンテナンス

N-GRAM

N-GRAMを使用する場合は、以下の設定の組み合わせに共通設定を組み合わせてトライすれば良い。

種別 class 説明 オプション 参考
tokenizer solr.StandardTokenizerFactory 標準的なTokenizerで、Unicode standard annex UAX#29に従ってトークン分割する。これ自体はN-GRAMとは関係なく、solr.CJKBigramFilterFactoryの方がN-GRAM生成の本体。 maxTokenLength=255 solr.StandardTokenizerFactory
tokenizer solr.ICUTokenizerFactory solr.CJKBigramFilterFactoryへトークンを渡す際に挙げられていたtokenizerの一つ。ちゃんと見てないが、StandardTokenizerFactory で良いだろう。 solr.ICUTokenizerFactory
filter solr.WordDelimiterFilterFactory 英数字やデリミタ(ハイフン等)で構成される文字の表記揺れを吸収する。 参考ページ参照 solr.WordDelimiterFilterFactory
filter solr.CJKBigramFilterFactory bigramへの分割を行う。StandardTokenizer または ICUTokenizer と組み合わせる。文字種(ひらがな、カタカナ)毎に分割をおこなうかどうか、unigramの出力をおこなうかどうか、を属性で指定できる。 han="true" hiragana="true" katakana="true" hangul="true" outputUnigrams="false" CJKBigramFilterFactory

実際の設定では、以下の組み合わせをベースに変更していく。(2013-08-27現在、defaultのまま)

<fieldType name="text_cjk" class="solr.TextField" positionIncrementGap="100">
  <analyzer>
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.CJKWidthFilterFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.CJKBigramFilterFactory"/>
  </analyzer>
</fieldType>

形態素解析

形態素解析を使用する場合は、以下の設定の組み合わせに共通設定を組み合わせてトライすれば良い。

種別 class 説明 オプション 参考
tokenizer solr.JapaneseTokenizerFactory 形態素解析器、KuromojiをSolrから使えるようにしたもの。これが基本。 mode="search" userDictionary="lang/userdict_ja.txt" Java製形態素解析器「Kuromoji」を試してみる, solrの日本語形態素解析の設定, kuromojiの辞書のメンテナンス
filter solr.JapaneseBaseFormFilterFactory 動詞の活用形等を基本形に変換する(正規化) Class JapaneseBaseFormFilterFactory
filter solr.JapanesePartOfSpeechStopFilterFactory tagsで指定されたファイルに記述された品詞を除外する tags="lang/stoptags_ja.txt" Class JapanesePartOfSpeechStopFilterFactory
filter solr.StopFilterFactory wordsで指定されたファイルに記述された単語を除外する ignoreCase="true" words="lang/stopwords_ja.txt" solr.StopFilterFactory
filter solr.JapaneseKatakanaStemFilterFactory カタカナ文字列最後の長音(ー)を除去する。minimumLengthで指定した文字数以上のカタカナのみが対象。 minimumLength="4" Class JapaneseKatakanaStemFilterFactory

実際の設定では、以下の組み合わせをベースに変更していく。(2013-08-27現在、defaultのまま)

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