显示类似用户

时间:2014-11-20 22:35:54

标签: ruby-on-rails thinking-sphinx

是否可以使用Thinking Sphinx输出8个(或其他指定的)类似用户?例如,我在加利福尼亚州的Males个人资料页面上。在类似用户部分下,它将显示来自加利福尼亚州的其他8名男性。这将是一个随机的8,没有特定的顺序。只需当前用户页面的性别和州位置即可。

我理解与Sphinx实现地理距离,对如何根据用户信息显示类似结果感到好奇。有人有这方面的例子吗?

2 个答案:

答案 0 :(得分:1)

首先,您需要实施像here所示的sphinx geodistance。 一个你已经完成它(让我们说你为User表做了)你现在可以做:

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

您可以使用"关键字"你喜欢什么@lat@lng是current_user坐标,@ geodist以米为单位表示(因此在这种情况下,它表示"从0到10km")。 您还需要性别上的条件(抱歉,我不知道您的模型字段名称,但如果您知道如何使用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

进行另一次狮身人面像搜索

答案 1 :(得分: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中名为sphinx_internal_id的属性)。
  • 随机顺序
  • 只有八个结果