Сортировка по количеству ассоциаций в Thinking Sphinx

У меня есть модель канала с двумя ассоциациями: «содержание» и «подписки».

В индексе каналов пользователь имеет возможность упорядочить каналы по количеству подписок или количеству одобренного контента.

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

Сначала я не использовал дельта-индексы и думал, что проблема может быть там, поэтому каждый раз, когда я утверждаю контент, я вызываю:

Delayed::Job.enqueue(DelayedRake.new("ts:index"), queue: "sphinx")

Поскольку у подписок нет индексов, я не переиндексирую каждый раз, когда создаю один (должен ли я это делать?)

Затем я начал использовать дельта-индексы в канале, и у меня все те же проблемы:

ThinkingSphinx::Index.define :channel, with: :active_record, delta: true do
  # fields
  indexes :name, sortable: true
  indexes description

  # attributes
  has created_at, sortable: true
  has approved, type: :boolean
  has public, type: :boolean

  join subscriptions
  has "COUNT(subscriptions.id)", as: :subscription_count, type: :integer, sortable: true

  join contents.approved
  has "COUNT(contents.id)", as: :content_count, type: :integer, sortable: true
end

А вот и поисковый вызов в контроллере:

  def index
    if params[:order_by].present?
      @channels = Channel.search params[:search],
                                 order: "#{params[:order_by]} DESC",
                                 page: params[:page], per_page: 6
    else
      @channels = Channel.search params[:search],
                                 order: :name,
                                 page: params[:page], per_page: 6
    end
  end

Подводя итог, у меня будут следующие вопросы: 1. Правильно ли сформированы индексы моих каналов? 2. Должны ли подписки также индексироваться или достаточно, чтобы присоединиться к ним в моем индексе каналов? 3. Должен ли я запускать переиндексирование после создания подписки / утверждения контента или дельта-индекс в канале имеет дело с этим, поскольку у меня эти два контроллера объединены в индексе канала?


person nunopolonia    schedule 07.11.2014    source источник


Ответы (1)


Ваш индекс выглядит нормально, но если вы используете дельты (и я думаю, что это самый разумный подход, чтобы иметь актуальные данные), тогда вы хотите активировать дельты для связанных каналов при создании подписки или контента. / отредактировано / удалено. Это описано в документации (см. Раздел «Дельты и ассоциации»), но вы бы увидели что-то подобное как в Подписке, так и в Контенте:

after_save :set_channel_delta_flag
after_destroy :set_channel_delta_flag

# ...

private

def set_channel_delta_flag
  channel.update_attributes :delta => true
end

Учитывая, что вы используете отложенное задание, я бы рекомендовал изучить ts-delayed-delta, чтобы убедиться, что дельта-обновления происходят вне обычного потока HTTP-запросов. И я настоятельно рекомендую не запускать полный индекс после каждого изменения - это может привести к довольно быстрому замедлению (и ненужному увеличению нагрузки на сервер).

person pat    schedule 09.11.2014
comment
Спасибо за ответ. Я следую вашему совету и интегрирую ts-delayed-delta, и у меня есть небольшой вопрос. Могу ли я выбрать очередь, в которой будут запускаться дельты? - person nunopolonia; 11.11.2014
comment
Если вы установите delayed_job_queue в предпочтительную очередь для каждой соответствующей среды в config/thinking_sphinx.yml, это должно помочь. - person pat; 12.11.2014