gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 09:21:46 31 4
gpt4 key购买 nike

我在 DynamoDB 中有一个表:

Id: int, hash key
Name: string

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

通常我只是根据它们的 ID 提取和更新项目,这个模式可以很好地解决这个问题。

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

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

我考虑了几种方法来解决这个问题:
  • 扫描 table 。这是最简单的选择,但效率最低。这张表中的数据比我经常扫描的数据要多一些。
  • 扫描+缓存在内存中。但后来我不得不担心缓存失效等。
  • 使 Name 成为范围键,它支持查询中的 begin_with 函数。但是,我仍然需要扫描表,因为我想检索每个散列键的结果,所以这实际上不起作用。
  • 制作全局二级索引并仅使用范围键进行查询。这似乎也不可能。我可以有一个带有静态值的列,并将其用作 GSI 的哈希键,但这似乎是一个非常丑陋的 hack。
  • 使用像 CloudSearch 这样的全文搜索引擎,但这对我的用例来说似乎有点过头了。

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

    最佳答案

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

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

    bucket_id 指的是固定范围的 ID 或数字,具有足够的基数以确保您的全局二级索引分布良好。例如,bucket_id范围可以从 0 到 99。然后在更新基表时,每当添加新条目时,随机 bucket_id 0 到 99 之间分配给它。

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

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

    关于amazon-dynamodb - 在 DynamoDB 上检索列以指定文本开头的所有项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32057005/

    31 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com