Как настроить поиск по фасету с отношением многие ко многим, используя Sunspot? - PullRequest
9 голосов
/ 26 марта 2010

Я раньше не реализовывал функцию поиска и чувствую себя немного застрявшим. У меня есть функция поиска Sunspot, которая находит результаты по ключевым словам - это прекрасно работает - но теперь я хочу реализовать функцию множественного выбора фасетов, но я даже не могу понять, как настроить базовый поиск фасетов.

У меня есть отношения многие ко многим (на рельсах, а не в реальной жизни):

Класс Люди has_many: навыки,: через => опыт (и наоборот и т.д.)

Class People < ActiveRecord::Base
  has_many :skills, :through => experience

  searchable do
    text :first_name, :surname
  end
end

В контроллере

@search = Sunspot.search(People)
   facet :skill_ids
end

Это основной пример, с которым я не могу работать. Он генерирует эту ошибку:

Sunspot::UnrecognizedFieldError: No field configured for People with name 'skill_ids'

Как создать ссылку на: skill_ids

Я думаю, что мне не хватает некоторой ссылки в модели - но ни один из примеров, которые я могу найти, не ссылается на идентификаторы отношений. В большинстве примеров, которые я нашел, используются столбцы, которые уже есть в этой модели при использовании функциональности фасетов.

  • Как мне заставить работать базовую реализацию?
  • Как бы я использовал это в представлении - нужно ли вызывать hit.facet и перебирать навыки? Как будет выглядеть код для отображения этого?
  • Как выбрать несколько фасетов для поиска?
  • Должен ли я поместить это в вики сообщества?

Спасибо, что уделили время!

1 Ответ

14 голосов
/ 26 марта 2010

Все, что вы хотите отфильтровать, получить или заказать, Sunspot должен знать. Итак, в вашей модели:

searchable do
  text :first_name, :surname
  integer :skill_ids, :multiple => true, :references => Skill
end

Ваш вызов #search в вашем контроллере выглядит правильно. По вашему мнению, вы бы сделали что-то вроде этого:

- @search.facet(:skill_ids).rows.each do |row|
  = row.instance.name

row.instance вернет экземпляр Skill, к которому относится значение строки (это то, что делает опция :references в определении searchable).

Я не уверен, что вы подразумеваете под «выбором нескольких фасетов для поиска» - можно создать несколько фасетов (которые дают пользователям выбор для дальнейшего уточнения поиска), вызвав метод facet несколько раз в поиске; и затем вы можете использовать их выбор фасетов с ограничениями области действия, используя метод with, который вы также можете вызывать столько раз, сколько захотите.

Говоря о вики, большая часть этой информации доступна (с дополнительными пояснениями) в вики Sunspot:

...