thinking_sphinx の設定
基本
config/sphinx.yml に設定を書く。下記のように database.yml っぽく environment 毎に設定を分けることが出来る。
development: port: 9312 test: port: 9312 production: port: 9312
rake ts:conf などとすると、このファイルを元に設定ファイル(config/{ENVIRONMENT}.sphinx.conf)が作られる。
インデックスファイルの場所
searchd_file_path オプションで設定する。デフォルトは db/sphinx/ENVIRONMENT
configuration, pid, log ファイルの場所
それぞれ下記のように設定する。下記の設定はデフォルト値。
development: config_file: "RAILS_ROOT/config/ENVIRONMENT.sphinx.conf" searchd_log_file: "RAILS_ROOT/log/searchd.log" query_log_file: "RAILS_ROOT/log/searchd.query.log" pid_file: "RAILS_ROOT/log/searchd.ENVIRONMENT.pid" # ... repeat for other environments
searchd デーモンのアドレスとポート
別マシンで searchd を動かしている時に設定する。
production: address: 10.0.0.4 port: 3200 # ... repeat for other environments if necessary
indexer のメモリ容量
index を作る indexer コマンドが使うメモリのリミットはデフォルトで64MB。下記のように変更できる。容量多くするとその分 index を作るのが早くなる
development: mem_limit: 128M # ... repeat for other environments
word stemming / Morphology
think と thinking が同じ意味を示すという設定ができる。英語とロシア語用の設定がビルトインされてる。Snowballで他の言語との設定も入手できるらしいけど、当然日本語はないので使うことはなさげ
development: morphology: stem_en # ... repeat for other environments
wildcard / Star Syntax
アスタリスクをワイルドカードとして使うことの出来る設定。デフォルトはオフ。
development: enable_star: true # ... repeat for other environments
接頭字と接中字のインデックス化
上のワイルドカードをオンにしたときに使う設定。prefix か infix を一度に両方設定することは出来ない。
最低のinfixとprefixの長さを設定できる。その長さより大きい単語がインデックスに入る?
0 が設定されたらこの機能は無効になる。全部をインデックス化したい場合は min_infix_len を 1 にセットする。でもそうするとパフォーマンスが悪化する。
development: min_infix_len: 3 # OR min_prefix_len: 3 # ... repeat for other environments
文字コード
デフォルトUTF-8
development: charset_type: sbcs # ... repeat for other environments
charset_tableで文字のマッピングを設定出来る。UTF-8で、他の文字(ASCII以外のことかな?)を含めたい時にcharset_tableを設定する。デフォルトは英語とロシア語。
development: charset_table: "0..9, A..Z->a..z, _, a..z, \ U+410..U+42F->U+430..U+44F, U+430..U+44F" # ... repeat for other environments
これに日本語の文字コードを指定してやっても、基本分かち書き(スペースで単語が分かれている)をベースにしているので、ngramの設定をしない限り日本語の検索は多分満足に出来ないと思う。
検索結果の件数が多い場合
検索を素早くするために、デフォルトではページネーションで使えるレコード数は1000をリミットにしている。変更したい場合は下記のようにして rebuild して、、
development: max_matches: 10000 # ... repeat for other environments
さらに検索時にオプションを付けてやる必要がある。
Article.search 'pancakes', :max_matches => 10_000
上記のコードは 10000 レコードを一発で得られるコードではない。あくまでページネーションの結果が 10000 レコードまで得られるというコード。一回で得たい場合は下記のようにする。
Article.search 'pancakes', :max_matches => 10_000, :per_page => 10_000