2012-01-19 4 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과 Alice가 있다고합니다. 밥의 (팬케이크)와 앨리스 (와플) 아이디어의 컬렉션 created_at을 내림차순으로 정렬 혼합, 제대로으로 페이지를 매긴 있도록

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

... 어떻게 든 그들을 결합 : 나는 다음 검색을 결합하려는 생각 스핑크스. 실제 유스 케이스에서는이 방식으로 결합하기 위해 2 ~ 15 건의 검색을 할 수있었습니다.

검색 방법이 ThinkingSphinx :: Search < 배열을 반환한다는 것을 알고 있습니다. 나는 수동으로이 객체들을 연결하는 것에 대해 생각했지만, 정렬과 페이지 매김을 모두 찾고 있다는 사실은 약간 까다 롭습니다.

Thinking Sphinx에서이 작업을 수행 할 수있는 우아한 방법이 있습니까? 아니면 누락 된 것이 없으며 제 자신을 굴려야합니까?

답변

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

중대한 제안 매김하고 간단한 종류를 사용할 수 있습니다,하지만이 쿼리는 찾기 '팬케이크'가 포함 앨리스으로 '와플'가 포함 밥 아이디어와 아이디어를 찾을 것 . "팬케이크"검색어가 밥의 아이디어에 적용되고 "와플"이 앨리스의 아이디어에만 적용되기를 바랍니다. –

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 

은 이제 일종의 날짜에 의해 당신이

4

는 스핑크스가 작업을 생각하는 데 도움이

sorted_results = results.sort_by(&:date) 

희망을 할 수있는 것처럼 카미나리. 당신은 이미 당신의 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) 

귀하가 결과에

관련 문제