如何在DynamoDB中实现无需OpenSearch的简易产品搜索功能
DynamoDB 轻量模糊检索实现方案
DynamoDB 原生没有支持全列任意子串检索的能力,确实没法直接对标 SQL 里的%LIKE%语法,但可以根据你的实际检索场景,选择以下不用全表扫描、也不用引入 OpenSearch 的低成本方案:
方案1:前缀/后缀固定的检索场景
如果你的模糊检索不是任意位置的子串,只是前缀匹配(比如搜索产品名以「华为」开头的商品),或者后缀匹配(比如搜索文件后缀为.xlsx的附件),可以直接用索引优化:
- 前缀匹配:把需要检索的字段设为排序键(SK),查询时用
begins_with()运算符即可直接走索引,成本和普通主键查询一致 - 后缀匹配:写入数据时额外把字段值反转存入单独列,比如把
product_name = "无线蓝牙耳机"反转后存为product_name_reverse = "机牙耳线蓝无",查询时把搜索词也反转,再用begins_with()查反转后的字段即可
方案2:少量固定列的任意子串检索
如果你只需要对2-3个核心列(比如产品名、品牌、分类)做任意子串检索,且数据量级在100万以内,可以手动实现n-gram倒排索引:
- 写入主产品表时,同步把需要检索的字段拆分为2-gram/3-gram分词(比如「无线耳机」拆分为
["无线", "线耳", "耳机"]),每个分词作为单独的倒排索引表的分区键,关联对应产品ID - 查询时把搜索词拆成同样粒度的分词,去倒排索引表查询匹配的产品ID,去重后再回主表拉取完整产品信息即可,全程走主键查询,无全表扫描,额外存储成本极低
方案3:固定关键词检索场景
如果你的检索需求是固定的关键词匹配,不是随机字符组合的子串,提前把所有可能的检索关键词提取出来,存入单独的列并创建全局二级索引(GSI),查询时直接匹配GSI的分区键即可。
注意:以上方案都只适合检索场景固定的轻量应用,如果你的需求是跨10个以上字段的任意随机子串检索、数据量超过百万,DynamoDB本身的设计定位并不适配这类场景,强行实现的后期维护成本反而会高于引入OpenSearch的成本。
内容的提问来源于stack exchange,提问作者Joseph Erblich
相关产品推荐
相关产品推荐

