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

maeshimaの日記

メモ書きです

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