Rails 实现类似微信查看附近的人有啥好办法

ihlayy · 2013年02月22日 · 最后由 ihlayy 回复于 2013年02月22日 · 8876 次阅读

比如数据库中有 50W 个用户(数据量较大时候),你要根据当前的定位查找距离你 1000 米内的那些人,别且按照远近距离排序。有什么思路?

sunspot 里面有个根据 location 进行搜索的和索引的,但是没看出得到的结果是排序的?

基本思路应该是

1)存用户数据的时候对经纬度进行索引

问题是,查询出结果的时候应该是已经排序的而不太好实时进行排序吧,实时排序会比较悲剧?

有用过 sunspot 进行 location 查询的么,项目里用它做全文搜索了

前段时间做过这个。 对比 oracle spatial,postgresql postgis,mongodb 之后选择了 postgresql。 测试结果表明,oracle 的准确度最好,但是一条 sql 需要调用几十个函数,效果不佳; postgresql 的 postgis 是目前最好的开源空间数据库,有个 gist 索引专门用来处理这些距离排序。至于准确度方面,普通情况下是按照直线距离算的,略有偏差,不过开启计算球面距离后效率不行了。(我们当时还考虑了地球是圆的,所以要算曲面距离); mongodb 的话,其实和 postgresql 差不多,性能稍微差点。

#2 楼 @zhuf 你们都是在 DB 层直接做的查询和索引啊,我们用的 DB 是 redis,好像只能借助类似 sunspot 这类东西做全文索引和复杂查询呢?

#3 楼 @ihlayy 恩,我们的用户地理信息都存在 postgresql 里面的。

#4 楼 @zhuf 你们的解决方案,效果如何查询的时候,从什么数据量开始会比较慢比如需要 1 秒以上的查询时间?

#5 楼 @ihlayy 我们测试的时候用的是 400w 数据

方案 mongodb postgres 平面距离 postgres 球面距离 oracle 索引情况 可以使用索引 可以使用索引 不能使用索引 可以使用索引 效率 好 好 非常糟 比较好 查询响应时间 20~40ms 20~40ms 10+ 40~100ms 更新响应时间 4~8ms 4~8ms - 10ms 准确度 一般 一般 好 好

我的做法是,通过当前经纬度和周边范围的半径,计算出 2 个点。这样讲估计你已经知道怎么做了。

然后就通过这两个点的经纬度来做索引条件。 得到一个比较小的数量,然后再排序。

#6 楼 @zhuf 谢谢啊,看来估计做好索引,查询应该还是比较快的。我去研究下 sunspot 查询出来的结果是否是排序的。。

我感觉就应该在查询出结果的时候就已经是排好序的,完全没必要自己再排一次。。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号