使用Thinking Sphinx按类别求和和值

时间:2014-05-24 22:08:33

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

我有这个型号:

class Job < ActiveRecord::Base
  has_many :groups, class_name: 'JobGroup', inverse_of: :job, dependent: :destroy
  has_many :placements, through: :groups
end

Group模型具有size属性,Placement具有name属性。然后我......

有3组的工作1:

  1. with placement_1和size:5
  2. with placement_2和size:10
  3. with placement_3和size:5
  4. 和2个小组的工作2:

    1. with placement_1和size:5
    2. with placement_2和size:15
    3. 使用thinking-sphinx我想按展示位置分组总和大小。像这样:

      [
         "placement_names",
         {
            "placement_name_1": 10,
            "placement_name_2": 25,
            "placement_name_3": 5
         }
      ]
      

      我需要在 ThinkingSphinx::Index.define :job, :with => :active_record do #... end 定义中加入哪些内容才能使其正常工作?

      我知道我可以在我的定义中添加这样的内容:indexes placements.name, as: :placement_names, facet: true以按展示位置名称计算作业数,但我不知道如何对按其他属性分组的值进行求和。

      更新

      根据Pat的回答,解决方案将是:

      job_ids = Job.search_for_ids
      q = JobGroup.select(['placements.name', 'placements.id as placement_id', 'SUM(job_groups.size) as size'])
      q = q.joins(:placement)
      q = q.where(job_id: job_ids)
      q = q.group('placement_id')
      

1 个答案:

答案 0 :(得分:1)

Sphinx确实无法满足您的要求,原因有两个:

  • Sphinx返回文档,而不是聚合。
  • Sphinx也没有哈希/词典/键值对的概念。如果您要对作业模型编制索引,则可以为每个文档(作业记录)设置一系列展示位置尺寸,但是您无法将这些尺寸与作业上下文中的特定展示位置名称相关联。

另一种方法是执行搜索以使作业ID匹配任何查询,然后在数据库中运行聚合而不仅仅是那些作业?思考Sphinx的search_for_ids方法采用与search相同的参数,但返回一个id数组而不是ActiveRecord对象(从性能角度来看,它可能很有用)。