实现 returns 按与当前用户的距离排序的服务操作的最佳方法是什么?

What is the best way to implement a service operation that returns places sorted by distance to the current user?

假设这样的服务操作

api/places/?category=entertainment&geo=123,456&area=30&orderBy=distance

因此用户正在搜索地理位置 (123,456) 附近的娱乐场所,边界不超过 30 公里,并希望结果按距离排序

假设搜索应该被分页,假设有 500 个项目满足查询,但是页面大小是 50,所以它有 10 页。

数据库中的每个项目只存储该地点的地理位置,然后我必须先从数据库中获取所有 500 个项目,计算每个项目的距离,将数组切割为页码,然后 return.

所以每次用户请求下一页时,我都必须查询所有 500 个,然后再做同样的事情。

这是实施此类服务的正确方法,还是有更好的策略?

当我的数据库没有地理位置时,情况似乎更糟,因为我正在使用不同的 API 提供商来给我一个地方的地理位置。这意味着我将不得不查询所有内容并点击另一个服务来获取地理信息、计算并最终能够排序...:(

非常感谢!

如果您正在为搜索结果开发单页应用程序,则无需在用户每次按下“下一步”时都向服务器发送另一个请求。您可以使用一个分页库,它获取完整的结果集并将它们相应地分类到页面中。

在这种情况下,需要在要存储的数据大小与 Web 应用程序的速度和效率之间进行权衡。在这种情况下,您真的应该处理大型数据集。理想情况下,您应该为每个一般地理区域(例如东北部、东南部)设置额外的数据库,以存储每个商店与用户可以输入的每个位置之间的距离。您应该为此使用单独的服务器,并使用自动数据库操作(例如 运行 MongoDB 脚本)每隔一段时间(例如,每六小时)聚合数据。

您还应该考虑使用加权图来存储位置之间的距离。然后,您可以使用绘图算法更轻松地遍历它们。