DynamoDB中的高效子字符串搜索

时间:2018-11-20 18:14:09

标签: search substring amazon-dynamodb

这是我的情况:

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

我在哪里

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

  • 我知道二级索引有助于分区,然后通过选定的键对项目进行排序(这使速度很快),但是我读到,这迫使用户进行精确的搜索(而不是子字符串搜索),那不是我所需要的。

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

有什么建议吗?

谢谢!

2 个答案:

答案 0 :(得分:2)

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

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

DynamoDB-> CloudSearch

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

CloudSearch

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

RDS

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

答案 1 :(得分:2)

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

这种要求,使用AWS ElasticSearch或CloudSearch之类的其他服务为数据库建立索引非常有效,这样您就可以在该服务之上应用查询并配置连续索引。

入门