我的数据集上有这个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)解决问题的三者的任意组合。
哪个应该是一个很好的解决方案?任何更好的建议也很有价值。
谢谢!
答案 0 :(得分:0)
这是一个有趣的问题。选项#1似乎是"对"一个但选项#2当然更快。
另外,你也可以结合2& 3,即,使用GSI作为连接的text
属性而不是排序键。这样,您始终可以只知道id
来获取项目,或仅查询知道text
的表格。 (顺便说一句,关于第3点你是对的)
您可能想要考虑的另一个丑陋方法是递归Scan(使用LastEvaluatedKey
/ ExclusiveStartKey
)。它不需要你改变你当前的表设计,但它当然很慢。由于您无法在使用text
属性返回结果之前过滤结果,因此您可以在代码中返回结果后过滤汉字/假名/含义数组,如果没有匹配则运行下一个扫描操作已找到且LastEvaluatedKey
出现在回复中。有关详细信息,请参阅Paginating the Results。