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

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

比如数据库中有 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 查询出来的结果是否是排序的。。

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

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