DynamoDB 中的高效子字符串搜索

Posted

技术标签:

【中文标题】DynamoDB 中的高效子字符串搜索【英文标题】:Efficient substring Search in DynamoDB 【发布时间】:2019-04-23 06:09:32 【问题描述】:

这是我的情况:

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

我在哪里:

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

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

我听说 Elastic Search 可能会有所帮助。

有什么建议吗?

谢谢!

【问题讨论】:

表格有多大(以字节为单位)? 你基本上必须扫描表才能得到结果。 这是临时查询还是新的常规数据访问模式? @MatthewPope 我不确定你的意思,但我在问题中添加了更多信息以便(也许)回答你。 @DiegoLeonvendagar 这是一次性搜索还是您需要经常做的事情?该问题的答案与推荐的解决方案不同。 【参考方案1】:

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

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

开始

Searching DynamoDB Data with Amazon CloudSearch Combining DynamoDB and Amazon Elasticsearch with Lambda Indexing Amazon DynamoDB Content with Amazon Elasticsearch Service Using AWS Lambda

【讨论】:

【参考方案2】:

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

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

DynamoDB -> CloudSearch

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

云搜索

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

RDS

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

【讨论】:

以上是关于DynamoDB 中的高效子字符串搜索的主要内容,如果未能解决你的问题,请参考以下文章

EWS 搜索子字符串的约会正文

Python:在字符串列表中最佳搜索子字符串

如何搜索子字符串(WHERE列LIKE'%foo%')

在区域下添加子文件夹并配置视图引擎以搜索子文件夹中的视图

sql MSSQL搜索子字符串

Gcloud 日志查看器 - 搜索子字符串过滤器不起作用