DynamoDB 支持全文搜索吗?

不,原生不支持。DynamoDB 没有全文搜索:没有相关性排序、没有词干还原、也没有模糊匹配——内置的字符串工具只有精确比较、排序键上的 begins_withcontains 子串过滤。AWS 给出的答案是与 Amazon OpenSearch Service 的零 ETL 集成,它把一张表复制进搜索索引,用于全文、向量和语义搜索。

原生能做到什么

  • 排序键上的 begins_with——在单个分区内做高效的前缀匹配;这是层级化排序键模型的骨干。
  • 过滤表达式里的 contains——子串匹配,但过滤是在读取之_后_才运行的,所以在 Scan 上你仍然要为检查过的每一个项目付读取的钱。这什么时候可以接受,见过滤策略指南

两者都不会给结果排序、不容忍拼写错误,也不理解词边界——它们是字符串谓词,不是搜索。

同一个查询,四种写法,实测

我们加载了 100 个带商品标题的项目(84 KB),并对表扫描了四次,只改动搜索词:

过滤条件CountScannedCount读取单元匹配到
contains(title, "run")310011Shoes for runs · Trail running shoe · Sneaker, runner grade
contains(title, "Run")210011Running shoes · Rungs for a ladder
contains(title, "running")110011Trail running shoe
contains(title, "runing")010011什么都没有

把这些行当成一个用户在搜索框里打字来读。"run" 漏掉了 Running shoesRUNNING SHORTS,因为比较是区分大小写的。"Run" 找回了 Running shoes,仍然漏掉 RUNNING SHORTS,还捎带上了 Rungs for a ladder,因为子串根本不知道一个词从哪里开始。这个查询无论怎么变大小写,都找不齐那三个。少打一个字母就什么都没有了,因为没有可以退化过去的模糊兜底。

最后一列才是花钱的部分。每一次扫描都消耗了 11 个读取单元,包括那次什么都没匹配到的,因为过滤是在读取之后才运行的。AWS 说得很直白:"A filter expression is applied after a Scan finishes but before the results are returned. Therefore, a Scan consumes the same amount of read capacity, regardless of whether a filter expression is present." 他们对上面这种形态自己的诊断是:"A high ScannedCount value with few, or no, Count results indicates an inefficient Scan operation."

所以一次搜索的价格跟的是商品目录的大小,永远不是查询的精确度。把这个接到一个边打字边搜索的输入框上,「running shoes」会把整张表计费十三次,每敲一次键一次,只为返回一个项目。

AWS 原生的答案:零 ETL 到 OpenSearch

OpenSearch Ingestion 的 DynamoDB 插件会把一张表同步进一个或多个 OpenSearch 索引:初始快照通过 DynamoDB 的 S3 导出加载(需要 PITR),之后由 DynamoDB Streams 近实时地复制更改。这条管道不消耗你表的任何读写吞吐量,所以放在生产流量旁边是安全的——而且 AWS 说这项集成能让你对 DynamoDB 数据做全文、向量和语义搜索。

深入了解

如果你的「搜索」其实是一次已知的查找,那就去修模型——过滤策略排序键策略指南展示了键能做到什么。在表达式构建器里试做 begins_with/contains 条件,并下载 DynoTable 在探索时对活的表数据做过滤。

参考资料

最后核实于 2026-07-13,依据上方链接的 AWS 官方文档。

这四次扫描运行于 2026-07-28,环境为 DynamoDB Local 3.3.0、@aws-sdk/client-dynamodb 3.1095.0、Node v24.18.0。CountScannedCount 和读取单元都是引擎自己给出的数字。

无需控制台即可使用 DynamoDB

一款快速的 DynamoDB 桌面客户端,可运行 DynamoDB 无法执行的真正 SQL——JOINs、GROUP BY、聚合——并支持可视化编辑和运行在你自己的 Bedrock 密钥上的 AI agent。

30 天免费试用,无需信用卡 — 之后为无时间限制的免费版。