查询具有不区分大小写条件的DynamoDB

Joc*_*per 9 amazon-web-services amazon-dynamodb

我们将组织名称存储在AWS上的DynamoDB表中,并希望在这些商业名称中保留官方大写,例如"TNT"和"FedEx".

我们的用例是应用程序的用户可以按名称搜索组织,但我们希望他们的查询被解释为不区分大小写.因此,对"FedEx","Fedex"或"fedex"的查询都应返回表中的正确项.

其他数据库有办法执行忽略大小写的查询(例如通过ILIKEPostgreSQL中的关键字),通过正则表达式表达查询,或者通过在条件中应用函数(例如 LOWER()函数).

如何在DynamoDB中完成?Amazon DynamoDB查询文档没有提供答案.

(最好的解决方法似乎是将名称存储两次:一次使用官方大写,一次使用名称转换为小写的另一个字段.然后应在后一个字段进行搜索,查询搜索项也是转换为小写.是的,我知道它增加了表的冗余.这是一种解决方案,而不是最佳解决方案.)

小智 11

是的,确切地说,当您添加新项目/行时,还要添加一个新字段searchName,即您的名称字段的小写字母(甚至更多,可能只是字母/数字/空格).然后搜索该searchName字段

  • 是的,DynamoDB 很糟糕,有很多黑客和解决方法只是为了简单的事情 (9认同)
  • DynamoDB 的全部目的是让编写不可扩展的查询变得不可能。这就是为什么存在某些限制和“解决方法”以及为什么数据需要以这种方式构建的原因。 (6认同)
  • 对于@Andrew 来说,这是古老的软件困境,一切都是权衡。DynamoDB 针对可扩展性进行了优化,但牺牲了灵活性。如果您认为它很糟糕,那么很可能它不适合您的用例。 (5认同)

小智 5

在dynamodb中写入重复数据不是一个好的设计。最好的解决方案是在dynamodb中添加“弹性搜索”。您可以使用aws控制台“直接使用”连接此组件。然后在弹性搜索中使用自定义分析器来获取不区分大小写的数据。

  • “在 dynamodb 中写入重复数据并不是一个好的设计。” 无论如何,我不同意这种说法,因为重复数据在 NoSQL 数据库中通常是一种非常好的做法。通常有必要支持您的访问模式,或者至少对从一开始就没有充分考虑访问模式的数据库进行修补。 (24认同)
  • 与其设置 Elasticsearch 并使集成工作,不如在表上创建二级索引(所有字符都转换为小写),并按照 http://docs.aws 中的描述查询/扫描该索引不是更容易吗? .amazon.com/amazondynamodb/latest/developerguide/SecondaryIndexes.html ? (5认同)
  • 附议上述答复。为如此简单的操作(尤其是像 Elasticsearch 这样管理复杂的操作)设置全新的存储类型是不合理的。如果目的是避免重复数据,它也无法实现这一点,因为您“仍然”在两个位置拥有数据,但现在它们很容易不同步。添加额外的发电机柱相对简单,不会引起任何问题。 (4认同)
  • 二级索引可能比设置ElasticSearch更容易进行初始投资,但从长远来看,它的灵活性较差且难以维护。次要索引的问题是,每次更新搜索字段中的数据时,您还需要更新次要索引。如果您的数据和/或架构经常更改,或者如果您有多个代码试图写入同一张表,那么它们中的_all_都需要一致地处理二级索引。ElasticSearch使这种索引透明化。 (3认同)
  • 这个答案是完全错误的,DynamoDB 经常有重复的数据,例如数据访问模式所需的属性,例如排序键“sortKey : /${region}/${category}/${productName}” `,所有这些属性也将存在于它们自己的列中。 (2认同)