Мышление Сфинкса и поиск нескольких моделей - PullRequest
0 голосов
/ 12 августа 2011

Я ищу способ выполнить поиск по нескольким моделям (см. в этом посте ) и получил пару ответов, в которых говорилось, что Thinking Sphinx подойдет для подобных вещей.

Действительно, это выглядит мило, и кажется, что возможности поиска по всему приложению (ThinkingSphinx.search) близки к тому, что я хочу. Но в документации указано, что будут возвращаться различные типы объектов модели в зависимости от того, где найдено совпадение.

У меня есть модели примерно такие:

  • Employee
  • Компания
  • Муниципалитет
  • Область

Когда сотрудники связаны с округом только через компанию, которая, в свою очередь, связана с муниципалитетом, который, в свою очередь, связан с фактическим округом.

Теперь в результате моего поиска я действительно хочу только объекты Employee. Например, поиск строки «joe tulsa» должен вернуть всех сотрудников, где оба слова можно найти где-то в названных моделях. Я получу несколько ложных срабатываний, но, по крайней мере, я должен получить каждого сотрудника по имени "Джо" в округе Талса.

Этого можно достичь с помощью встроенной функциональности Thinking Sphinx?

1 Ответ

3 голосов
/ 12 августа 2011

Я думаю, что в этом случае вам следует определить ассоциации для вашей Employee модели (которую вы, вероятно, уже имели), например:

class Employee < ActiveRecord::Base
  ...
  belongs_to :company
  has_one :municipality, :through => :company
  has_one :county, :through => :company
  ...
end

class Company < ActiveRecord::Base
  ...
  belongs_to :municipality
  has_many :employees
  has_one :county, :through => :municipality
  ...
end

class Municipality < ActiveRecord::Base
  ...
  belongs_to :county
  has_many :companies
  ...
end

class County < ActiveRecord::Base
  ...
  has_many :municipalities
  ...
end

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

После того, как ассоциации установлены, вы можете определить индекс Сфинкса в вашей модели Employee, например:

define_index do
  indexes :name, :sortable => :true
  indexes company(:name),      :as => :company
  indexes municipality(:name), :as => :municipality
  indexes county(:name),       :as => :county
  ...
end

Таким образом, столбцы в ваших ассоциациях также индексируются, и Sphinx автоматически объединяет все эти таблицы вместе при построении индекса.

...