Индексирование полей + пользовательский текст в Thinking Sphinx - PullRequest
1 голос
/ 28 августа 2011

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

Например, если я хочу найти совпадение только в моей модели муниципалитета, я настроил индекс в этой модели, чтобы пользователь теперь мог запросить "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

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

1 Ответ

1 голос
/ 28 августа 2011

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

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

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

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

...