将多个Thinking Sphinx查询的结果组合到一个分页结果中

时间:2012-01-19 07:21:17

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

是否有一种简单的方法可以将多个Thinking Sphinx搜索结果合并到一个结果中?所有这些搜索都在同一个模型上,但搜索具有不同的搜索字词。我要做的是将结果组合起来,以便它们都可以按日期列进行排序并获得适当的分页。

假设我有一个Thinker类和一个Idea类。

class Thinker < ActiveRecord::Base
  has_many :ideas
end

class Idea < ActiveRecord::Base
  belongs_to :thinker

  define_index do
    indexes text
    has created_at
  end
end

并说我有两个思想家,鲍勃和爱丽丝。我想结合以下搜索:

bob.ideas.search 'pancakes', :order => :created_at, :sort_mode => :desc
alice.ideas.search 'waffles', :order => :created_at, :sort_mode => :desc

......并以某种方式将它们组合在一起,以便将Bob的(煎饼)和Alice的(华夫饼)想法的集合混合在一起,按降序created_at排序,并由Thinking Sphinx正确分页。在实际使用案例中,我可以在2到15次搜索中以这种方式组合。

我知道搜索方法会返回一个ThinkingSphinx :: Search&lt;阵列。我想过手动将这些对象拼接在一起,但我正在寻找排序和分页的事实使得这有点棘手。

在Thinking Sphinx中有没有一种优雅的方法可以做到这一点,或者我没有遗漏任何东西,而且我几乎不得不自己动手?

3 个答案:

答案 0 :(得分:4)

思考Sphinx与Kaminari合作。 所以你已经在你的gemfile中拥有了kaminari。你必须这样做:

result = bob.ideas.search 'pancakes', :order => :created_at, :sort_mode => :desc
result += alice.ideas.search 'waffles', :order => :created_at, :sort_mode => :desc

结果不再是ThinkingSphinx :: Search。这是一个数组

result = Kaminari.paginate_array(result)

您可以对结果使用分页和简单排序

答案 1 :(得分:1)

first_search = bob.ideas.search 'pancakes', :order => :created_at, :sort_mode => :desc
second_search = bob.ideas.search 'pancakes', :order => :created_at, :sort_mode => :desc
results = first_search.flatten + second_search.flatten

您现在可以按照您想要的日期排序

sorted_results  = results.sort_by(&:date)

希望这会有所帮助

答案 2 :(得分:0)

您可以非常轻松地执行此操作,但是您需要重写查询以使其更通用并在Idea模型本身上进行搜索。

Idea.search 'pancakes | waffles', :with => {:thinker_id => [bob.id, alice.id]}, 
                                  :order => :created_at, 
                                  :sort_mode => :desc,
                                  :match_mode => :boolean

你的模型将是:

class Idea < ActiveRecord::Base
  belongs_to :thinker

  define_index do
    indexes text
    has created_at, thinker_id
  end
end
相关问题