Как выполнить гео-поиск по нескольким моделям с ThinkingSphinx?
-
06-07-2019 - |
Вопрос
У меня есть две модели, проиндексированные для поиска (Пользователь и Предмет). Я пытаюсь выполнить гео-поиск по моделям:
ThinkingSphinx :: Search.search ('ключевые слова',: geo = > [
degrees_to_radians (PARAMS [: лат] .to_f),
degrees_to_radians (PARAMS [:] .to_f LON)
],
) Код>
Но я получаю только ошибку:
Ошибка сфинкса: индекс item_core, item_delta, user_core, user_delta: неизвестный атрибут широты ''
Поиск каждой модели в отдельности работает нормально ... но я не знаю, в чем здесь проблема. Вот индексы:
Индекс пользователя:
define_index do
indexes [:first_name, :last_name], :as => :name
indexes login
indexes email
indexes headline
indexes description
indexes business.name, :as => :business_name
indexes [addresses.street_1, addresses.street_2, addresses.city, addresses.postal_code], :as => :address
has created_at, :sortable => true
has addresses.latitude, :as => :latitude, :type => :float
has addresses.longitude, :as => :longitude, :type => :float
set_property :delta => true
end
Предметный указатель:
define_index do
indexes title, :sortable => true
indexes description
indexes [address.street_1, address.street_2, address.city, address.postal_code], :as => :address
indexes images.title, :as => :image_titles
indexes images.description, :as => :image_descriptions
indexes categories(:name), :as => :category_names
has price, :sortable => true
has created_at, :sortable => true
has address.latitude, :as => :latitude, :type => :float
has address.longitude, :as => :longitude, :type => :float
has categories(:id), :as => :category_ids
where "`items`.`state` = 'for_sale'"
set_property :delta => true
end
Решение
Это поздний ответ, но лучше, чем ничего, надеюсь:
Когда вы не выполняете поиск по конкретной модели, Thinking Sphinx не имеет контрольной точки для того, чтобы знать, какие атрибуты доступны, поэтому вам нужно явно указать, какие атрибуты lat и long использовать:
ThinkingSphinx::Search.search('keywords',
:geo => [
degrees_to_radians(params[:lat].to_f),
degrees_to_radians(params[:lon].to_f)
],
:latitude_attr => "latitude",
:longitude_attr => "longitude"
)