Thinking Sphinx отложенная дельта-индексация — индекс не обновляется при удалении записи

#ruby-on-rails #delayed-job #thinking-sphinx

#ruby-on-rails #отложенная работа #thinking-сфинкс

Вопрос:

У меня возникли проблемы с использованием отложенных дельт с thinking_sphinx. Это модель:

 Event
  has_many :subscriptions
  has_many :users, :through => :subscriptions
  ...
  define_index do
    indexes name
    indexes users(:id), :as => :user_id
    set_property :delta => :delayed
  ...

Subscription
  belongs_to :event
  belongs_to :user

User
  has_many :subscriptions
  has_many :events, :through => :subscriptions
  

Когда пользователь добавляет / удаляет подписку, я устанавливаю флаг дельта для всех соответствующих событий с помощью обратных вызовов модели подписки, подобных этому:

 after_save :set_events_delta_flag
after_destroy :set_events_delta_flag

def set_events_delta_flag
  Event.define_indexes
  sql = "UPDATE events SET delta = true FROM subscriptions"
  sql << " WHERE events.id = subscriptions.event_id AND (subscriptions.id = #{self.id})"
  Event.connection.update(sql)
  Event.index_delta
end
  

Это работает нормально, когда пользователь добавляет подписку: выполняется обратный вызов, а затем выполняется задание ThinkingSphinx::Deltas::DeltaJob и обновляет индекс. Однако, когда пользователь удаляет подписку, выполняется обратный вызов и DeltaJob, но кажется, что индекс не обновляется:

Если я сделаю что-то вроде:

 Event.search("". :with => {:user_id => XX}).search_count
  

до и после удаления подписки количество не меняется (оно меняется до и после добавления подписки)

это ожидаемое поведение? Что я делаю не так?

Обновление: похоже, что Sphinx хранит две копии одного и того же документа (одну в основном индексе и одну в дельта-индексе) является причиной проблемы.

Ответ №1:

С обновлением до Sphinx 2.0.3 эта проблема с наличием 2 индексов исчезнет. индексы будут объединены в один. Вы можете попробовать обновить его.