2017-01-05 37 views
0

我有以下结构DynamoDB搜索与HashKey

HashKey: Place Name 
Attribute: Place Data Class 

现在我想用地名查找表,

例如:我有以下数据

Newyork {lat: x.xxxxx, lng: x.xxxxxx} Newzealand {lat: x.xxxxx, lng: x.xxxxxx} IndialaPolis {lat: x.xxxxx, lng: x.xxxxxx}

当我搜索关键字new,它应该返回纽约和纽泽兰,我搜索谷歌这一点,我发现我们可以通过哈希得到所有记录键

+1

DynamoDB不支持像这样部分匹配查询HashKey。您可能需要考虑像Elasticsearch之类的东西来索引数据。 –

+0

谢谢,我有疑问,数据是永久性的吗?我可以存储一些汇总数据在Elastic Search – rak

+0

@MarkB可以请你检查这个答案http://stackoverflow.com/a/41513677/4234949 – rak

回答

0

谢谢@标记B和@布鲁诺buccolo,正如你说,这是不可能的搜索hashkey场

所以我手动创建的弹性搜索索引该表的每一次更新原来的记录更新

2

在做Query时,您只能在HashKey上进行完全匹配。

但是,也有Scan操作,您可以与FilterExpression一起使用。请注意,QueryScan的执行和消耗能力不同。 See the differences here

这里是你可以用begins_withScan例如使用参数:

{ 
    table_name: tableName, 
    filter_expression: "begins_with(#country, :search)", 
    expression_attribute_names: { 
     "#country" => "country" 
    }, 
    expression_attribute_values: { 
     ":search" => "new" 
    } 
} 

article是一个良好的开端。

+0

但是'scan'操作扫描'整个表'如果表中有更多的行是非常困难的'扫描'操作每次用户搜索,所以我要使用弹性搜索@MarkB建议, 如果我错了,你能请解释更多谢谢 – rak

+0

你是对的,'扫描'贯穿整个桌子。但是,如果这只是世界上所有国家的名单,你应该没问题。您还应该注意到,从'Dynamo'到'ElasticSearch'的复制滞后。如果您在'Dynamo'上插入一个项目,您就会查询'ElasticSearch',它可能不在那里。再次,如果这是所有国家的名单,那么你也应该没问题,因为国家不会经常改变。 –

+0

它不是一个静态列表,当用户开始使用应用程序时,列表将被更新,所以我尝试使用eastic搜索,并且在插入新项目时手动将项目添加到索引中以进行弹性搜索,现在它工作正常。你能解释更多关于复制滞后 - 我找不到任何方式设置复制到dynamodb和弹性搜索,我如何设置dynamodb和弹性搜索的复制 – rak