是否可以从DynamoDB上的列表中的对象查询属性?

时间:2018-03-22 04:02:28

标签: amazon-web-services nosql amazon-dynamodb

我的数据集上有这个JSON结构到日语字典(它有更多的实体,但代码片段会做例子):

"id" : 1259290, 
"kanji" : [ {
  "common" : true, 
  "text" : "見る", 
  "tags" : [  ]
}, {
  "common" : false, 
  "text" : "観る", 
  "tags" : [  ]
}, {
  "common" : false, 
  "text" : "視る", 
  "tags" : [  ]
} ], 
"kana" : [ {
  "common" : true, 
  "text" : "みる", 
  "tags" : [  ], 
  "appliesToKanji" : [ "*" ]
} ]

一个独特的单词可以有很多读数和许多类型的读数。我的目标是制作一个搜索工具,根据单词的三个方面搜索正确的单词:“汉字”列表中对象上的文本,“假名”列表中对象上的文本和英文含义,这个例子中没有显示,但它与其他两个基本相同。用户可以输入三者中的任何一个,结果将显得透明。

我找不到使用DynamoDB的问题的好解决方案,因为使用排序键看起来不可行,并且在过滤器和items attributes的文档中没有任何示例似乎适合的示例,没有他们似乎在列表中迭代以找到对象或类似的东西。我想了一些解决方案,我想了解它们是否可行:

1)制作4个表格,将单词读数的可能性和含义分开,并将文本用作Hash Key。查询所有表格进行简单搜索看起来很昂贵。

2)连接各种对象的文本属性,并使它们可用作排序键或字符串属性,以便更容易查询。该表将有冗余信息。

3)创建GSI以便我能够使用所需的属性进行查询,但是根据我所看到的情况,它是不可能的,因为它们在列表中。如果我错了,请纠正我。

4)解决问题的三者的任意组合。

哪个应该是一个很好的解决方案?任何更好的建议也很有价值。

谢谢!

1 个答案:

答案 0 :(得分:0)

这是一个有趣的问题。选项#1似乎是"对"一个但选项#2当然更快。

另外,你也可以结合2& 3,即,使用GSI作为连接的text属性而不是排序键。这样,您始终可以只知道id来获取项目,或仅查询知道text的表格。 (顺便说一句,关于第3点你是对的)

您可能想要考虑的另一个丑陋方法是递归Scan(使用LastEvaluatedKey / ExclusiveStartKey)。它不需要你改变你当前的表设计,但它当然很慢。由于您无法在使用text属性返回结果之前过滤结果,因此您可以在代码中返回结果后过滤汉字/假名/含义数组,如果没有匹配则运行下一个扫描操作已找到且LastEvaluatedKey出现在回复中。有关详细信息,请参阅Paginating the Results