DynamoDB 中的高效子字符串搜索

Die*_*gar 4 search substring amazon-dynamodb

这是我的情况的背景:

  • 我在 dynamoDB 中有一个巨大的数据库,里面有 250.000 个项目。(示例)
  • 我希望能够通过 3 个属性“子字符串搜索”,获取与子字符串匹配的所有项目的列表。
  • 我希望能够搜索的属性在不同项目之间可以具有相同的值。
  • 我的哈希键是一个 id(真正区分项目的唯一属性)。
  • 我使用 react native 作为客户端
  • 我的架构有这些“查询类型”查询

我在哪里:

  • 我首先尝试使用 listCaballos 查询进行查询,将用户输入作为过滤器添加到查询中,并使用 nextToken 递归遍历整个表(不使用二级索引),但是遍历表并返回需要 6 分钟项目。

  • 我知道二级索引有助于分区,然后通过选择的键对项目进行排序(这使得它很快),但是我读到这会强制用户进行精确搜索(不是子字符串类型的搜索),这不是我需要的.

  • 我听说弹性搜索可能会有所帮助。

有什么建议?

谢谢!

Ash*_*han 8

这在 DynamoDB 中效率不高。尽管您可以创建二级索引来搜索“begins_with”,但子字符串(“contains”)功能仅适用于在大型数据集中效率不高的过滤器(因为 DynamoDB 将使用 IOPS 查询所有内容,然后应用过滤器)。

这种要求,使用 AWS ElasticSearch 或 CloudSearch 等其他服务对数据库进行索引是有效的,以便您可以在该服务之上应用查询并配置连续索引。

入门


Mat*_*ope 5

您将无法使用二级索引来帮助创建(合理的)广义子字符串搜索。

有很多方法可以解决您的问题。在这里,我介绍了其中的一些,这绝不是详尽无遗的。

DynamoDB -> 云搜索

CloudSearch 可以为您的数据提供常规搜索功能。基本上,您可以将 lambda 函数连接到表中的 DynamoDB 流。该 lambda 函数可以使您的 CloudSearch 域保持最新。以下是此过程的概述。

云搜索

您可以放弃 DynamoDB 并将此数据存储在 CloudSearch 中。这消除了对 lambda 函数的需要,意味着您的数据只存储在一个地方。但是,您需要容忍更长的一致性时间,因为 CloudSearch 没有像 DynamoDB 那样的强一致性读取。

RDS

您可以只使用某种 SQL 数据库。它们中的大多数支持全文搜索。如果您不想管理数据库实例,您甚至可以使用 AWS Aurora Serverless。