具有多个属性的复杂过滤查询



我有一个页面,我列出了一些实体,并提供了多个过滤选项的接口。为了简化问题,假设我列出了该页面上的各种电影。因此,对于单个电影条目,非规范化行应该像这样;

  • producer_id:分区密钥-(例如:PRODUCER#213141)
  • movie_id: Sort Key -(例如:MOVIE#887347)
  • producer_name:(例如:"Warner ")
  • movie_name:(如:"哈利Potter"
  • status:(例如:"ON_SHOW")
  • publish_date:(e.g.: "2020.01.01">
  • type:(例如:"fantasy")
  • language:旅客:"English"

我想通过使用用作GSI辅助键的组合属性来启用过滤。我的复合属性看起来像这样;

  • GS1SK: "哈利波特#2020.01.01#奇幻#英语#ON_SHOW">

这个二级索引的分区键就是producer_id

假设任何用户来到这个页面,想要用给定的过滤选项过滤掉电影。这样的访问模式示例是;

获取所有科幻华纳兄弟出品的电影并已ON_SHOW.

然而,问题从这里开始。由于组合属性不是层次化的,因此组合属性不能用于此场景。因为在上面的访问模式示例中,用户可以选择不指定任何日期,只是希望获得任何日期范围的结果。但是,当您查看复合属性的结构时,不提前为筛选其他属性(如电影类型或电影语言)指定日期范围是不可能的。

我知道DynamoDB不是最适合这种复杂的查询,但是,我认为在清单页面中提供过滤选项是一个非常典型的场景,即使是最简单的产品也应该提供。我的问题是,我应该使用什么样的方法来满足这种过滤需求。

  1. 也许我得到复合属性背后的想法是错误的?
  2. 我应该使用过滤表达式,没有办法做这样的高级过滤与复合gsi ?
  3. 也许在这种情况下,我应该考虑弹性搜索或AWS雅典娜服务?
  4. 我需要在我的应用程序的其他页面中提供更多的过滤选项,例如过滤列出的用户及其人口统计信息。你认为我应该考虑迁移rbs而不是使用NO-SQL数据库吗?

我真正想做的是在没有任何过滤表达式的情况下提供这些过滤功能,以减少RCU的使用,并提高查询的效率。我将感激任何帮助和建议。谢谢。

听起来您对复合属性非常了解,并且对选项有很好的把握。您无意中发现了DynamoDB的一个弱点。使用DynamoDB来支持这种特殊的搜索功能是很有挑战性的。

我见过使用弹性搜索(你的选项#3)之类的工具解决这个问题。一种常见的模式是启用DynamoDB流,它可用于更新Elastic Search索引。需要设置更多的基础设施,但是搜索功能比单独使用DynamoDB要灵活得多。

相关内容

  • 没有找到相关文章

最新更新