2012-01-19 11 views
5

Czy istnieje prosty sposób na połączenie wyników wielu wyszukiwań Thinking Sphinx w jednym wyniku? Wszystkie te wyszukiwania są w tym samym modelu, ale wyszukiwania mają różne wyszukiwane hasła. Próbuję połączyć wyniki, aby wszystkie mogły być posortowane według kolumny daty i otrzymać odpowiednią paginację.Łączenie wyników wielu zapytań Thinking Sphinx w pojedynczy wynik w paginacji

Powiedz, że mam klasę Thinker i klasę 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 

Powiedzmy, że mam dwóch myślicieli, Boba i Alice. Chcę połączyć następujące wyszukiwań:

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

... i jakoś połączyć je tak, że zbiór (waflowe) pomysłów Boba (naleśnik) i Alice są zmieszane razem, posortowane według malejącej created_at i prawidłowo stronicowana przez Myślący Sfinks. W rzeczywistym przypadku mógłbym połączyć w ten sposób od 2 do 15 wyszukiwań.

Wiem, że metoda wyszukiwania zwraca tablicę ThinkingSphinx :: Search <. Myślałem o ręcznym łączeniu tych obiektów razem, ale fakt, że szukam zarówno sortowania, jak i paginacji, sprawia, że ​​jest to trochę trudne.

Czy jest jakiś elegancki sposób na zrobienie tego w Myślącym Sfinksie, czy też niczego nie brakuje, a ja sam muszę się przewrócić?

Odpowiedz

0

Prawdopodobnie możesz to zrobić całkiem łatwo, ale musisz przerobić swoje zapytania, aby były bardziej ogólne i przeszukaj sam model Idea.

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

A model będzie:

class Idea < ActiveRecord::Base 
    belongs_to :thinker 

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

Świetna propozycja, ale ta kwerenda będzie znaleźć również znaleźć pomysły Bob zawierające „wafle” i pomysłów autorstwa Alice, które zawierają „naleśniki” . Chcę tylko, by hasło "naleśniki" odnosiło się do pomysłów bobu i "gofrów" do pomysłów 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 

można teraz sortować według daty, jak chcesz

sorted_results = results.sort_by(&:date) 

nadzieję, że to pomaga

4

Myślenie Sphinx pracować Kaminari. Masz już kaminari w swoim gemfile. Po prostu musisz:

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

Wynik nie jest już ThinkingSphinx :: Search. Jest to tablica

result = Kaminari.paginate_array(result) 

Twój może korzystać paginacji i prosty rodzaju na skutek

Powiązane problemy