2014-10-27 7 views
2

Я рассматриваю использование Thinking Sphinx, поскольку я уже использовал ElasticSearch и хотел бы попробовать что-то новое.Geo дистанционный фильтр с Thinking Sphinx

При использовании ThinkingSphinx, как бы организовать настройку фильтра геоданных. Будет модель User, содержащая основную информацию пользователя, которая включает их почтовый индекс. Там есть модель местоположений, которая будет иметь географическую информацию Соединенных Штатов (почтовый индекс, широта, долгота, состояние).

Пример: Текущий пользователь «Michael» почтовый индекс 30601. типа Michael в форме поиска «программист, видеоигр». Результаты возврата будет показать пользователь, которые имеют слово «программист» или «видеоигру» из атрибута в модели пользователя, которые расположены в пределах 100 миль почтового индекса Майкла 30601.

Я установил ThinkingSphinx , и в моем приложении, если я выполнил поиск, как описано в приведенном выше примере, он вернет совпадения «программист» или «видеоигры», но только с пользователями, которые имеют 100% точное соответствие почтовому индексу (он отменяет использование геоинформации расстояние). Теперь с кодом, который у меня есть, я могу выполнить поиск по географическим расстояниям с использованием почтового индекса, который будет возвращать окружающих Пользователей. Геометрическое расстояние, похоже, не работает, когда я учитываю атрибуты из модели User с помощью почтового индекса.

Это было сделано с легкостью, используя Elastic в прошлом, но я хотел видеть, как работает Thinking Sphinx. Если у кого-то есть ключ к тому, как это будет выглядеть в контроллере Searches, пожалуйста,

ответ

1

С точки зрения Sphinx, почтовые индексы не полезны - все это сводится к широте и долготе.

Так, если в вашем примере Майкл current_user, вы можете иметь поисковый вызов ищет что-то вроде этого:

User.search 'programmer video games', 
    :geo => [current_user.latitude, current_user.longitude], 
    :with => {:geodist => 0.0..161_000.0}, 
    :order => 'geodist ASC' 

Имейте в виду, что это предполагает, что вы имеете значения широты и долготы, хранящиеся в радианах, а не градусы. Если они находятся в градусах, то вы захотите преобразовать их в определение индекса (как указано в the docs), а также при поиске (например, current_user.latitude * Math::PI/180.0).

При фильтрации по расстоянию Сфинкс использует счетчики - одна миля составляет почти 1610 метров, следовательно, конверсия в моем примере выше.

+0

спасибо. Настройка была довольно простой, как только вы понимаете, как работает Сфинкс. – pwz2000