Индексирование полей + настраиваемый текст в Thinking Sphinx

У меня есть индексы для нескольких разных моделей, и иногда пользователь может искать значение, которое существует в нескольких моделях. Теперь, если пользователя действительно интересуют только данные из одной из моделей, я бы хотел, чтобы пользователь мог пре / постфиксировать запрос чем-то, чтобы ограничить область действия.

Например, если я хочу найти совпадение только в моей модели муниципалитета, я настроил индекс в этой модели, чтобы теперь пользователь мог запрашивать "xyz municipality" (в кавычках):

  define_index do
    indexes :name, :sortable => true
    indexes "name || ' municipality' name", :as => :extended_name, :type => :string
  end

Это прекрасно работает. Теперь у меня также есть модель Person, связанная с муниципалитетом. Я бы хотел, чтобы при поиске только по модели Person была доступна такая же функциональность, чтобы я мог сказать Person.search («xyz municipality») и связать всех людей с этим муниципалитетом. Это мое текущее определение в модели Person:

  has_many :municipalities,  :through => :people_municipalities

  define_index do
    indexes [lastname, firstname], :as => :name, :sortable => true
    indexes municipalities.name, :as => :municipality_name, :sortable => true
  end

Но есть ли способ создать индекс по этой модели со ссылкой на муниципалитеты, как тот, который у меня есть по самой модели муниципалитета?


person rogerkk    schedule 28.08.2011    source источник


Ответы (1)


Если вы посмотрите на сгенерированный SQL в параметре sql_query config/development.sphinx.conf для источника person_core_0, вы увидите, как муниципальные образования.name объединяются вместе (я бы опубликовал пример, но это зависит от вашей базы данных - MySQL и PostgreSQL справятся с этим полностью иначе).

Я бы рекомендовал продублировать поле и вставить что-то вроде этого (SQL - это псевдокод):

indexes "GROUP_CONCAT(' municipality ' + municipalities.name)",
  :as => :extended_municipality_names

Также: нет особого смысла добавлять: sortable true ни к этому, ни к исходному полю из ассоциации - собираетесь ли вы сортировать по всем объединенным именам муниципалитетов? Полагаю, что нет :)

person pat    schedule 28.08.2011