假设我有一个数据库表,代表可能有数百万条记录的用户(一厢情愿)。此表包含有关每个用户的大量信息,包括有关其位置的信息:
- 城市
- 县/州等
- 国家
- 纬度
- 经度
- 基于纬度/经度值的 Geohash。
我想实现一个功能,登录用户可以搜索附近的其他用户。
理想情况下,我想抓取地理上最接近用户的 20 个用户,然后是接下来的 20 个和接下来的 20 个等等。所以基本上我希望能够按照与某个点的距离对我的 users 表进行排序.
方法一
我以前使用过半正弦公式来计算一个点和几百个其他点之间的距离。这种方法在相对较小的记录集上是理想的,但我担心对于如此大的记录集它会变得非常慢。
方法二
我还对地理散列进行了一些研究,我了解散列是如何计算的,并且我了解了散列如何表示位置以及精度如何因较短的分辨率而损失的理论。我当然可以通过抓取与他们的 geohash 具有相似开头的用户来抓取位于用户地理区域附近的用户(基于我指定的精度 - 并可能查看邻近区域)但这并不能解决问题需要按位置排序。这种方法也不适用于边缘情况,其中 2 个用户可能彼此非常接近,但靠近由 geohash 表示的 2 个区域的边缘。
对此方法的任何想法/建议将不胜感激。我不是特别在寻找代码,但指向好的示例和资源的链接会有所帮助。
谢谢,乔纳森
编辑
方法 3
经过一番思考,我想出了另一个可能的解决方案来考虑。在收到每个用户的位置信息后,我会将有关位置的信息(城镇/城市、地区、国家、纬度、经度、geohash 可能)存储在单独的表中(例如locations
)。然后我会通过外键将用户连接到该位置。这会给我一个小得多的数据集来使用。为了找到附近的用户,我可以简单地找到靠近用户位置的其他位置,然后使用他们的 ID 来查找其他用户。然后,也许可以通过存储每个位置的附近位置 ID 列表来实现某种缓存。