maeshimaの日記

メモ書きです

sunspot(solr)の設定方法

Advanced Fulltext Search Configuration - GitHubの意訳。

デフォルトの設定だと、スペースか他の区切り文字で区切られている前提。区切りにはStandardTokenizerというのを使ってる。大文字小文字を区別させないようにするためにはLowerCaseFilterというのを使ってる。

初回に rake sunspot:solr:start を叩いたときに solr/conf/schema.xml が出来る。これをいじることで全文検索の設定が出来る。

デフォルトの設定に追加するには

stemming(例:"run"で"runnning"が引っかかる)と同義語の設定を追加するには schema.xml を下記のようにする

<fieldType name="text" class="solr.TextField" omitNorms="false">
  <analyzer>
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.StandardFilterFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
</fieldType>

上記の fieldType の属性は sunspot で定義したテキストフィールドで使われる。analyzer は下記のように index を作る時とクエリを投げるときとで分けることが出来る。

<fieldType name="text" class="solr.TextField" omitNorms="false">
  <analyzer type="query">
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.StandardFilterFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
  <analyzer type="index">
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.StandardFilterFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
</fieldType>

ここまではインデックス作る時とクエリ投げるときで一緒の設定だし、デフォルトの設定と同じ。ここから、インデックスを作る時に同義語のサポートをするように修正する。

<fieldType name="text" class="solr.TextField" omitNorms="false">
  <analyzer type="query">
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.StandardFilterFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
  <analyzer type="index">
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.StandardFilterFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true" />
  </analyzer>
</fieldType>

このまま同義語のサポートを続けるなら synonyms.txt を作る必要がある。詳しくは AnalyzersTokenizersTokenFilters - Solr Wiki

さらに stemming の機能を追加する。

<fieldType name="text" class="solr.TextField" omitNorms="false">
  <analyzer type="query">
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.StandardFilterFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.PorterStemFilterFactory"/>
  </analyzer>
  <analyzer type="index">
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.StandardFilterFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true" />
    <filter class="solr.PorterStemFilterFactory"/>
  </analyzer>
</fieldType>

設定を変更したら、Solr を再起動してインデックスを作り直す必要がある。これ以上の設定を知りたければ wiki をみるべし。