2014-11-20 4 views
2

Возможно ли использование Thinking Sphinx для вывода 8 (или других указанных) похожих пользователей? Например, я нахожусь на странице профиля Males, которая живет в Калифорнии. В разделе «Подобные пользователи» он отобразит 8 других мужчин из Калифорнии. Это будет случайный 8, никакого конкретного порядка. Просто местоположение пола и состояния текущей страницы пользователя должно быть одинаковым.Отображение схожих пользователей

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

+0

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

ответ

1

Вы можете использовать подход геодезистов, предложенный iMacTia, хотя я боюсь, что это может быть излишним.

Я предполагаю, что состояние и пол являются полями в вашем индексе Sphinx для пользователей. Это находится в контексте вашего контроллера, где вы просматриваете @user и хотите, чтобы у вас были похожие пользователи.

User.search(
    :conditions => {:state => @user.state, :gender => @user.gender} 
    :without => {:sphinx_internal_id => @user.id}, 
    :order  => 'RAND()', 
    :per_page => 8 
) 

Ломая каждый из этих вариантов:

  • Фильтра по соответствующему государству и полу
  • Не включать текущий пользователь (первичный ключ модели является атрибут в Сфинксе именем sphinx_internal_id) ,
  • Случайный порядок
  • только восемь результатов
1

Прежде всего, вам необходимо реализовать геоинформацию сфинкса, как показано на рисунке here. Один вы сделали это (скажем, вы сделали это для таблицы пользователей) теперь вы можете сделать:

@compatible_users = User.search "keyword", :geo => [@lat, @lng], 
    :with => {'@geodist' => 0.0..10_000.0} 

Вы можете использовать «ключевое слово», что вы предпочитаете. @lat и @lng - координаты current_user, @geodist выражается в метрах (поэтому в этом случае это означает «от 0 до 10 км»). Вам также понадобится условие для пола (извините, я не знаю вашего имени полей модели, но это не должно быть проблемой, если вы знаете, как использовать sphinx) Как только у вас есть коллекция @compatible_users, задача Теперь, чтобы случайно выбрать некоторые из них:

n = 8 # This is the number of users you want. 

# Ruby 1.9+ 
@ result = @compatible_users.sample(n) 

# Ruby 1.8 
@ result = @compatible_users.shuffle[0...n] 

и у вас есть совместимые пользователей в @result :)

Имейте в виду, что если @compatible_users.size ниже n вы получите сообщение об ошибке с помощью shuffle и более короткий массив, используя sample. Таким образом, вам может потребоваться проверить его и, в конечном счете, сделать еще один поиск сфинкса с более широким диапазоном @geodist

Смежные вопросы