在Thinking Sphinx中按关联计数排序

时间:2014-11-07 11:29:41

标签: ruby-on-rails-4 thinking-sphinx

我有一个包含2个关联的频道模型,“内容”和“订阅”。

在频道索引中,用户可以按订阅数量或已批准内容的数量订购频道。

在开发过程中,一切似乎都能正常工作(通过观察结果,可能出现故障并且数据不足以正确看待它),在分期中结果是随机的,有时会正确显示,有时候不要吨。

起初我没有使用delta索引,并认为问题可能存在,所以每当我批准我打电话的内容时:

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

由于订阅没有索引,我每次创建索引时都不会重新索引(我应该这样做吗?)

然后我开始在频道中使用delta索引,我仍然遇到同样的问题:

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.在我创建订阅/批准内容或渠道中的增量索引后,我是否应该运行reindex,因为我在频道索引中加入了这两个控制器?

1 个答案:

答案 0 :(得分:1)

您的索引看起来很好,但如果您正在使用增量(我认为这是最明智的方法,让数据保持最新),那么您希望在订阅时触发相关渠道的增量内容已创建/编辑/删除。这在the documentation中有所介绍(请参阅“Deltas和Associations”部分),但您在Subscription和Content中都会看到类似的内容:

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请求流中发生增量更新。我强烈建议不要在每次更改后运行完整索引 - 这可能会很快变得非常慢(并且不必要地增加服务器负载)。