2012-01-19 8 views
5

Esiste un modo semplice per combinare i risultati di più ricerche di Sfida di pensiero in un unico risultato? Tutte queste ricerche sono sullo stesso modello, ma le ricerche hanno termini di ricerca distinti. Quello che sto cercando di fare è combinare i risultati in modo che possano essere tutti ordinati per una colonna della data e ricevere un'adeguata paginazione.Combinare i risultati di più query di Sphinx di pensiero in un singolo risultato impaginato

Dire che ho una classe di pensatori e una classe di idee.

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 

E dire che ho due pensatori, Bob e Alice. Voglio combinare le seguenti ricerche:

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

... e in qualche modo li combinano in modo che la raccolta di (cialde) idee (pancake) di Bob e Alice di sono mescolati insieme, in ordine di discesa created_at, e correttamente impaginato da Sfinge pensante. Nel caso di utilizzo effettivo, potrei avere ovunque tra 2 e 15 ricerche da combinare in questo modo.

So che il metodo di ricerca restituisce una matrice ThinkingSphinx :: Search <. Ho pensato di unire manualmente questi oggetti insieme, ma il fatto che sto cercando sia l'ordinamento che l'impaginazione rendono tutto un po 'complicato.

C'è un modo elegante per farlo in Thinking Sphinx o non mi manca niente e devo praticamente girare il mio?

risposta

0

Probabilmente è possibile farlo abbastanza facilmente, ma è necessario riscrivere le query per essere più generico e cercare sul modello Idea stesso.

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

E il vostro modello sarebbe:

class Idea < ActiveRecord::Base 
    belongs_to :thinker 

    define_index do 
    indexes text 
    has created_at, thinker_id 
    end 
end 
+1

Grande suggestione, ma questa query avrebbe trovato anche trovare idee di Bob che contengono 'cialde', e le idee di Alice che contengono 'pancakes' . Voglio solo che il termine di ricerca "pancake" si applichi alle idee di Bob e alle "cialde" alle idee di Alice. –

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 

si può ora ordina per data, come si vuole

sorted_results = results.sort_by(&:date) 

speranza che questo aiuta

4

Thinking Sphinx lavorare con Kaminari. Quindi hai già kaminari nel tuo file gemma. Devi solo fare:

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

Il risultato non è più un ThinkingSphinx :: Search. Si tratta di una serie

result = Kaminari.paginate_array(result) 

tuo può utilizzare l'impaginazione e semplice sorta sul risultato