Мышление Сфинкса: несколько индексов для одной модели? - PullRequest
1 голос
/ 06 января 2012

Я ищу в двух разных режимах, используя Thinking Sphinx:

  1. Полный поиск на одной модели для нормальной функциональности поиска
  2. Полный поиск по всем моделям для автозаполнения раскрывающегося списка функций

Ради этого вопроса, скажем, у меня есть модель Персона и Страна.

При выполнении регулярных поисков я хочу получить всех людей, чье название страны соответствует строке поиска. Чтобы достичь этого, я добавил индекс по названию страны в индекс Person. Пока все хорошо.

При поиске в моем раскрывающемся списке автозаполнения я хочу показать все страны и всех людей, соответствующих моей строке поиска. Здесь проблема обнаруживается. Выполняя поиск по всему приложению, я теперь получаю:

  1. все страны, чье имя соответствует моей строке поиска
  2. все доктора, чье имя совпадает с моей строкой поиска, и, к сожалению ...
  3. всех врачей, принадлежащих к стране, которая соответствует строке поиска.

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

Ответы [ 2 ]

2 голосов
/ 25 августа 2015
Синтаксис

sphinx v3 для ответа выше:

ThinkingSphinx::Index.define :country, name: "my_first_in", with: :active_record
  indexes name
end
2 голосов
/ 07 января 2012

Я предположил, что ваши модели похожи на приведенные ниже:

class Person < ActiveRecord::Base
  belongs_to :country
  define_index
    indexes :name
    indexes country(:name), :as => country_name
  end
end

class Country < ActiveRecord::Base
  has_many :people # has_many :persons # depending on your singular/plural case
  define_index
    indexes :name
  end
end

Таким образом, вы можете получить результат, не имея 3 (третье условие), выполнив запрос:

ThinkingSphinx.search :conditions => {:name => params[:q]}, :classes => [Person, Country]

Но, если вы хотите создать несколько индексов для модели, это можно сделать, как показано ниже:

class Person < ActiveRecord::Base
  belongs_to :country
  define_index :my_first_in do
    indexes :name
    indexes country(:name)
  end
  define_index :my_second_in do
    indexes :name
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...