思维狮身人面像的地理距离滤镜

时间:2014-10-27 19:53:30

标签: ruby-on-rails thinking-sphinx

我正在考虑使用Thinking Sphinx,因为我已经使用过ElasticSearch并希望尝试新的东西。

在使用ThinkingSphinx时,如何设置地理距离滤镜。将存在包含用户的基本信息的用户模型,其包括他们的邮政编码。有一个地点模型,可以获得美国的地理信息(邮政编码,纬度,经度,州)。

  

示例:当前用户“迈克尔”邮政编码为30601.迈克尔在搜索表单中输入“程序员,视频游戏”。返回结果会   显示拥有“程序员”或“视频游戏”字样的用户   用户模型中位于100英里范围内的属性   迈克尔的邮政编码30601。

我已经安装了ThinkingSphinx,并且在我的应用程序上,如果我执行上面示例中详细说明的搜索,它将返回“程序员”或“视频游戏”匹配,但仅限于与邮政编码100%完全匹配的用户代码(它使用geo dist取消)。现在有了我的代码,我可以使用邮政编码执行地理距离搜索,这将返回周围的用户。当我使用邮政编码从用户模型中分配属性时,地理距离似乎不起作用。

过去使用Elastic很容易完成,但我想看看Thinking Sphinx是如何工作的。如果有人对搜索控制器中的外观有所了解,请

1 个答案:

答案 0 :(得分: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)。

按距离过滤时,Sphinx使用米 - 一英里差不多1610米,因此在上面的示例中进行了转换。