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

ウェブサービスを作っています。

運用のための Sunspot 設定

sunspot solr rails

Ruby on Rails で Solr による検索を行う Sunspot に関して、私が運用上設定している内容を公開します。

config/sunspot.yml の設定

Sunspot (v1.3.3 現在) では、ジョブやタスクでインデックスを追加・更新した場合、自動でコミットが行われません。
そのため、auto_commit_after_request は false に設定し、代わりに Solr 側の設定 (後述) で自動 commit を行います。
また、Capistrano と連携できるよう、solr_home, data_path, pid_dir を適切に設定します。

production:
  auto_commit_after_request: false
  solr:
    solr_home: <%= File.expand_path('../../current/solr', Rails.root) %>
    data_path: <%= File.expand_path('../../current/solr/data', Rails.root) %>
    pid_dir: <%= File.expand_path('../../current/solr/pids', Rails.root) %>
    ...

...

solr/conf/solrconfig.xml の設定

autoCommit のコメントアウト部分を解除します。

    <!-- Perform a <commit/> automatically under certain conditions:
         maxDocs - number of updates since last commit is greater than this
         maxTime - oldest uncommited update (in ms) is this long ago
         Instead of enabling autoCommit, consider using "commitWithin"
         when adding documents. http://wiki.apache.org/solr/UpdateXmlMessages
    <autoCommit> 
      <maxDocs>10000</maxDocs>
      <maxTime>1000</maxTime> 
    </autoCommit>
    -->

    <!-- Perform a <commit/> automatically under certain conditions:
         maxDocs - number of updates since last commit is greater than this
         maxTime - oldest uncommited update (in ms) is this long ago
         Instead of enabling autoCommit, consider using "commitWithin"
         when adding documents. http://wiki.apache.org/solr/UpdateXmlMessages
    -->
    <autoCommit> 
      <maxDocs>10000</maxDocs>
      <maxTime>1000</maxTime> 
    </autoCommit>

に変更します。

config/deploy.rb (Capistrano) の設定

after "deploy:setup" do
  ...
  run "mkdir #{ shared_path }/solr"
  run "mkdir #{ shared_path }/solr/data"
  run "mkdir #{ shared_path }/solr/pids"
end

after "deploy:update_code" do
  ...
  run "ln -nfs #{ shared_path }/config/sunspot.yml #{ release_path }/config/sunspot.yml"
  run "ln -nfs #{ shared_path }/solr/data #{ release_path }/solr/data"
  run "ln -nfs #{ shared_path }/solr/pids #{ release_path }/solr/pids"
end

.gitignore の設定

.gitignore に、以下を追加します。

config/sunspot.yml
solr/data
solr/pids