设置
请求的行为
基本上,以下规则必须适用于要显示的帖子:
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中)。