双向地理空间搜索

时间:2015-08-06 13:30:54

标签: solr sunspot sunspot-rails

设置

  • 我的应用程序中有两个模型:查看器和帖子
  • 观众和帖子都有
    • 由lat / lon字段指定的位置
    • 由整数值
    • 表示的半径

请求的行为

  • 观看者只能看到当前搜索范围内的帖子
  • 观看者只有在帖子的半径范围内才能看到帖子。这是为帖子提供可见性的领域。

基本上,以下规则必须适用于要显示的帖子:

post.radius   >= distance(post, viewer)
viewer.radius >= distance(post, viewer)

问题

第一条规则实施起来并不太难:

class Post < ActiveRecord::Base
  searchable do
    integer :radius
    latlon(:location) { Sunspot::Util::Coordinates.new(latitude, longitude) }
  end
end

# PostController
Post.search do
  with(:location).in_radius(viewer.latitude, viewer.longitude, viewer.radius)
end

然而,第二条规则要求我能够利用solr查询中帖子和查看器之间的距离,例如:与

with(:radius).greater_than distance(:location, viewer.latitude, viewer.longitude)

据我所知,使用太阳黑子的内置方法无法实现这一目标。 solr甚至能够处理这样的查询吗?

如果没有,处理这个问题可能是更好的解决方案吗?

This问题似乎朝着同一个方向发展,但有点模糊,与太阳黑子没有直接关系。

修改

动机:我目前的解决方案是仅获取满足第一条规则的帖子(在观众的半径范围内),然后过滤掉半径为< distance(viewer, post)的帖子。 现在使用太阳黑子的命中而不是结果(请参阅注释)来从结果数据库查询中删除不需要的帖子。

此解决方案有效,但它会影响Solr的总结果数和分页。在最坏的情况下,整个当前页面可能是空的(所有帖子都被过滤掉了)。因此,最好将两个规则应用于查询中(在Solr中)。

0 个答案:

没有答案