【问题标题】:DynamoDB Search with HashKey使用 HashKey 进行 DynamoDB 搜索
【发布时间】:2017-01-05 06:56:41
【问题描述】:

我有以下结构的表

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搜索时,它应该返回Newyork和Newzealand,我在google上搜索了这个,我发现我们可以通过HashKey获取所有记录

【问题讨论】:

  • DynamoDB 不支持像这样查询 HashKey 的部分匹配。您可能需要考虑在 Elasticsearch 之类的工具中为您的数据建立索引。
  • 谢谢,我有一个疑问,数据是永久的吗?我可以在 Elastic Search 中存储一些聚合数据
  • @MarkB 你能检查一下这个答案吗stackoverflow.com/a/41513677/4234949

标签: amazon-web-services amazon-dynamodb aws-java-sdk


【解决方案1】:

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

但是,还有Scan 操作,您可以将其与FilterExpression 一起使用。请注意QueryScan 执行和消耗容量的方式不同。 See the differences here.

以下是您可以在 Scanbegins_with 上使用的示例参数:

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

这个article 是一个很好的起点。

【讨论】:

  • 但是scan 操作会扫描whole table 如果表有更多行,那么每次用户搜索时都很难进行scan 操作,所以我将按照@MarkB 的建议使用弹性搜索,如果我错了,请您解释一下谢谢
  • 你是对的,scan 遍历整个表格。但是,如果这只是世界上所有国家的列表,那应该没问题。您还应该注意,从DynamoElasticSearch 存在复制滞后。如果您在 Dynamo 上插入项目后立即查询 ElasticSearch 它可能不存在。同样,如果这是所有国家/地区的列表,您也应该没问题,因为国家/地区不会经常变化。
  • 它不是静态列表,列表会随着用户开始使用应用程序而更新,所以我尝试使用东方搜索,当有新项目时,我手动将项目添加到弹性搜索中的索引插入,现在工作正常。您能否详细解释一下复制滞后 - 我找不到将复制设置为 dynamodb 和弹性搜索的任何方法,我该如何设置 dynamodb 和弹性搜索的复制
【解决方案2】:

谢谢@mark-b 和@bruno-buccolo,正如你所说,搜索哈希键字段是不可能的

所以我手动为该表创建了弹性搜索索引,并在每次原始记录更新时更新

【讨论】:

    猜你喜欢
    • 2016-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多