2012-01-19 157 views
5

是否有一種簡單的方法將多個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排序,並適當通過分頁思維獅身人面像。在實際使用情況下,我可以在2至15個搜索範圍內以這種方式進行組合。

我知道搜索方法返回一個ThinkingSphinx :: Search <數組。我想到了將這些對象手動拼接在一起,但是我正在尋找排序和分頁的事實,這使得這有點棘手。

在思考獅身人面像中有沒有一種優雅的方式來做到這一點,或者我不會錯過任何東西,我幾乎必須推出自己的?

回答

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 
+1

偉大的建議,但此查詢會發現還發現由Bob包含「薄煎餅」理念包含「華夫餅乾」和想法愛麗絲。 我只希望「煎餅」搜索詞適用於鮑勃的想法和「華夫餅」愛麗絲的想法。 –

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) 

希望這有助於

4

思考獅身人面像一起工作雷。 所以你已經有你的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) 

你可以使用分頁和簡單排序在結果上

相關問題