首页 > 解决方案 > 按距离排序查询需要读取整个数据集?

问题描述

要在 DynamoDB 中执行地理查询,AWS 中有一些库 ( https://aws.amazon.com/blogs/mobile/geo-library-for-amazon-dynamodb-part-1-table-structure/ )。但是要按距离对地理查询的结果进行排序,必须读取整个数据集,对吗?如果地理查询产生大量结果,则如果您按距离排序,则无法对其进行分页(在后端,而不是对用户),是吗?

标签: amazon-web-servicesamazon-dynamodb

解决方案


你是对的。要按与某个任意位置的距离对所有数据点进行排序,您必须从 DynamoDB 表中读取所有数据。

在 DynamoDB 中,您只能使用已存储在 DynamoDB 表中并用作表或其索引之一的排序键的预计算值对结果进行排序。如果您需要按距离固定位置的距离进行排序,那么您可以使用 DynamoDB 执行此操作。


可能的解决方法(有限制)

  • TLDR;如果您只对距离任意点 X 公里以内的项目进行排序,这不是一个糟糕的问题。

这仍然涉及对内存中的数据点进行排序,但是通过产生不完整的结果(通过限制结果的最大范围)使问题变得更容易。

为此,您需要点 P 的 Geohash(从该点测量所有其他点的距离)。假设它是 A234311。然后,您需要选择合适的结果范围。让我们在这上面放一些数字以使其具体化。(我完全是在编造这些数字,因为实际数字与理解这些概念无关。)

A - represents a 6400km by 6400km area
2 - represents a 3200km by 3200km area within A
3 - represents a 1600km by 1600km area within A2
4 - represents a  800km by  800km area within A23
3 - represents a  400km by  400km area within A234
1 - represents a  200km by  200km area within A2343
1 - represents a  100km by  100km area within A23431

从图形上看,它可能如下所示:

View of A                           View of A23
|----------|-----------|            |----------|-----------|
|          | A21 | A22 |            |          |           |
|    A1    |-----|-----|            |   A231   |    A232   |
|          | A23 | A24 |            |          |           |
|----------|-----------|            |----------|-----------|
|          |           |            |          |A2341|A2342|
|    A3    |     A4    |            |   A233   |-----|-----|
|          |           |            |          |A2343|A2344|
|----------|-----------|            |----------|-----------|  ... and so on.

在这种情况下,我们的点 P 在 A224132 中。还假设我们想要得到 400km 内的排序点。A2343 是 400 公里乘 400 公里,因此我们需要从 A2343 及其所有8 个连接的邻居(A2341、A2342、A2344、A2334、A2332、A4112、A4121、A4122)加载结果。然后,一旦我们只加载了内存中的那些,然后您计算距离,对它们进行排序,并丢弃任何超过 400 公里的结果。

(您可以保留超过 400 公里的结果,只要用户/客户知道超过 400 公里,数据可能不完整。)

DynamoDB Geo 库使用的散列方法与Z-Order Curve非常相似— 您可能会发现熟悉该方法以及AWS 数据库博客关于 Z-Order Indexing for Multifaceted Queries 的第 1 部分第 2部分会很有帮助在 DynamoDB 中。


推荐阅读