Мышление Sphinx с задержкой дельта-индексации - индекс не обновляется при удалении записи - PullRequest
1 голос
/ 08 апреля 2011

У меня проблемы с использованием отложенных дельт с 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

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

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

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

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

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

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

1 Ответ

2 голосов
/ 17 марта 2012

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

...