【问题标题】:Sorting by association count in Thinking Sphinx在 Thinking Sphinx 中按关联计数排序
【发布时间】:2014-11-07 11:29:40
【问题描述】:

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

在频道索引中,用户可以按订阅数量或批准的内容数量对频道进行排序。

虽然在开发过程中一切似乎都正常运行(通过观察结果,可能会出现故障并且是没有足够的数据来正确查看的问题),但在暂存时,结果是随机的,有时会正确显示,有时不会' t.

起初我没有使用增量索引,并认为问题可能存在,所以每次我批准我调用的内容时:

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

【问题讨论】:

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


    【解决方案1】:

    您的索引看起来不错,但如果您使用的是增量(我认为这是最明智的方法,让数据保持最新),那么您希望在订阅或订阅时为相关频道触发增量内容被创建/编辑/删除。 the documentation 对此进行了介绍(请参阅“增量和关联”部分),但您会在订阅和内容中看到类似的内容:

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

    【讨论】:

    • 感谢您的回答。我正在听从您的建议并整合 ts-delayed-delta ,我有一个小问题。我可以选择运行增量的队列吗?
    • 如果您将delayed_job_queue 设置为config/thinking_sphinx.yml 中每个适当环境的首选队列,那应该可以解决问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多