Объединение результатов нескольких запросов Thinking Sphinx в один разбитый на страницы результат - PullRequest
5 голосов
/ 19 января 2012

Есть ли простой способ объединить результаты нескольких поисков 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

... и каким-то образом объединить их так, чтобы набор идей Боба (блин) и Алисы (вафля) смешивался вместе, сортировался по убыванию create_at и правильноразбито на «Мыслящего сфинкса».В конкретном случае использования у меня может быть от 2 до 15 запросов для комбинирования таким образом.

Я знаю, что метод поиска возвращает массив ThinkingSphinx :: Search

Есть ли элегантный способ сделать это в Thinking Sphinx, или я не пропустилчто-нибудь, и я в значительной степени должен свернуть свое собственное?

Ответы [ 3 ]

4 голосов
/ 15 сентября 2012

Мышление Сфинкса работает с Каминари. Итак, у вас уже есть каминари в вашем гемфайле. Вам просто нужно сделать:

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 голос
/ 09 февраля 2012
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)

надеюсь, это поможет

0 голосов
/ 19 января 2012

Вероятно, вы можете сделать это довольно легко, но вам нужно переписать ваши запросы, чтобы они были более общими, и выполнить поиск по самой модели 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
...