Upgrading Thinking Sphinx

The release notes on GitHub are a good source for what notable changes have occured in each release - and especially breaking changes.

If you’re using a version of Thinking Sphinx older than v4, please refer to older documentation.

The breaking changes since v4.x are:

  • Sphinx 2.1 is no longer supported. You must use Sphinx 2.2.11 or newer.
  • Ruby 2.3 (or older) is no longer supported. Arguably the code may still work in older Ruby versions, but it’s only tested against 2.4+.
  • Rails 4.1 (and older) is no longer supported. Arguably the code may still work in older Rails versions, but it’s only tested against 4.2+.
  • All indexed models require explicit callbacks (see below).

Callbacks

Previously, Thinking Sphinx added automatic callbacks to every single ActiveRecord model, and then passed on relevant updates/deletions to Sphinx where possible (e.g. when using SQL-backed indices with deltas).

However, this is unnecessary overhead for models that aren’t being indexed, so now you must add those callbacks yourself - just to the models that are being indexed:

# if your indexed model is app/models/article.rb:
class Article < ApplicationRecord
  # if you're using SQL-backed indices:
  ThinkingSphinx::Callbacks.append(
    self, :behaviours => [:sql]
  )

  # if you're using SQL-backed indices with deltas:
  ThinkingSphinx::Callbacks.append(
    self, :behaviours => [:sql, :deltas]
  )

  # if you're using real-time indices
  ThinkingSphinx::Callbacks.append(
    self, :behaviours => [:real_time]
  )
  # this replaces:
  # after_save ThinkingSphinx::RealTime.callback_for(:article)
end

Models with real-time indices should have already had some callbacks added, but the above syntax replaces the old approach. The indexing documentation covers further options for edge cases.