Rails plugin which extends Xapit to provide automatic syncing of the index.
For an alternative solution (currently vaporware) see Xapit Server.
github.com/ryanb/xapit-server/tree/master
This plugin assumes you have a Rails application using Xapit. For more information see: github.com/ryanb/xapit/tree/master
Install the plugin and run migrations.
script/plugin install git://github.com/ryanb/xapit-sync.git rake db:migrate
That is all you need to get started in development, but you should see the customize portion below.
Xapit Sync is a Rails plugin designed to update only the Xapian records which have changed and then reload the database automatically.
Each time a Xapit member (model) is created, updated, or destroyed it will record that change in a separate database table.
A separate process will spawn (if it isn’t already running) which updates the Xapian database with all changes recorded. At the end of this process it will trigger a Rails controller/action which is included in the plugin (using Rails metal and/or engines). This will notify the Rails application that the Xapian database needs to be reloaded.
You will want to customize Xapit Sync to work with your application in production. It is best to do this at the bottom of the setup_xapit.rb initializer file.
If you have your own queuing system (such as delayed_job) it is better to use that instead of the built-in script runner.
class XapitSyncJob def perform XapitSync.sync end end # in config/initializers/setup_xapit.rb XapitSync.override_syncing do Delayed::Job.enqueue XapitSyncJob.new end
You can also disable the syncing process in certain environments. For example:
XapitSync.override_syncing { } unless Rails.env.production?
You’ll likely want to customize which domains are triggered when the syncing finishes in order to reload the Xapian database.
XapitSync.domains = ["localhost:8000", "localhost:8001"] if Rails.env.production?
Unfortunately there is not yet a solution to trigger the reloading if you are using Passenger, so you should disable it in that case.
XapitSync.domains = [] if Rails.env.production?