检索 DynamoDB 上以指定文本开头的列的所有项目

2024-03-28

我在 DynamoDB 中有一个表:

Id: int, hash key
Name: string

(还有很多列,但我省略了)

通常,我只是根据项目的 ID 提取和更新项目,这个模式非常适合这种情况。

然而,要求之一是有一个基于名称的自动完成下拉框。我希望能够查询此 DynamoDB 表中以查询字符串开头的名称列的所有项目。

解决这个问题的 SQL 方法是在 Name 上添加索引并编写一个查询,例如 SELECT Id FROM table WHERE Name LIKE 'query%',但我无法找出 DynamoDB 友好的查询这样做的方法。

我考虑了几种方法来解决这个问题:

  1. 扫描桌子。这是最简单的选择,但效率最低。该表中的数据比我经常扫描的数据要多一些。
  2. 扫描+将其缓存在内存中。但随后我不得不担心缓存失效等问题。
  3. 将Name设为范围键,支持开始于查询上的函数。但是,我仍然需要扫描表,因为我想检索每个哈希键的结果,所以这实际上不起作用。
  4. 建立一个全局二级索引,只用range key来查询。这似乎也是不可能的。我可以拥有一个具有静态值的列,并将其用作 GSI 的哈希键,但这似乎是一个非常丑陋的黑客行为。
  5. 使用像 CloudSearch 这样的全文搜索引擎,但这对于我的用例来说似乎是巨大的杀伤力。

这个问题有一个简单的解决方案吗?


目前 DynamoDB 的查询操作不直接支持您描述的用例 - DynamoDB 通常要求您指定一个哈希键,然后相应地对范围键进行查询。

但是,有一种流行的分散收集技术通常用于像您这样的用例。在这种情况下,您将添加一个属性bucket_id并创建一个全局二级索引bucket_id作为哈希键,并且Name作为范围键。

Bucket_id 指的是固定范围的 ID 或数字,具有足够的基数以确保全局二级索引分布均匀。例如,bucket_id范围可以从 0 到 99。然后在更新基表时,每当添加新条目时,都会随机生成一个bucket_id0 到 99 之间的值被分配给它。

在自动完成查询期间,应用程序将为每个bucket_id值(0到99)发送100个单独的查询(分散)并使用BEGINS_WITH在范围键名称上。检索结果后,应用程序必须合并 100 组响应并根据需要重新排序(收集)。

上述过程可能看起来有点麻烦,但它通过确保负载均匀分布在固定的键范围内,使您的系统/表能够很好地扩展。您可以根据情况增大bucket_id范围。为了节省成本,您可以选择投影KEYS_ONLY到您的全局二级索引中,因此查询成本最小化。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

检索 DynamoDB 上以指定文本开头的列的所有项目 的相关文章

随机推荐