javascript - DynamoDB 索引查询包括

标签 javascript amazon-web-services amazon-dynamodb dynamodb-queries

我正在尝试查询 DynamoDB 表并检查我传入的查询是否包含在表索引的分区键中。

例如,我有一个 DynamoDB 表,其中包含下面的示例数据。

+-----+----------------+---------------------------------------------+
| id  |     title      |                 description                 |
+-----+----------------+---------------------------------------------+
| id1 | My Title One   | This is an awesome item in my database      |
| id2 | My Title Two   | This is also an awesome item in my database |
| id3 | The Item Three | Hello World                                 |
+-----+----------------+---------------------------------------------+

我在属性 title 上有一个全局索引。主分区键是id

我想要做的是接受用户的搜索查询并匹配标题的所有项目。

我有以下代码,可以将用户术语与标题完全匹配。

const params = {
    ExpressionAttributeValues: {
        ":q": {
            S: req.query.q
        }
    },
    KeyConditionExpression: "title = :q",
    TableName: "MyTable",
    IndexName: 'title-index'
};

dynamodb.query(params, (err, titles) => {
    if (err) {
        return res.status(500).send({"Error": "Error"});
    }

    titles = titles.Items
    .map(item => AWS.DynamoDB.Converter.unmarshall(item));

    return res.send(titles);
});

因此,如果用户搜索 My Title One,它将返回 ID 为 id1 的结果。现在我想添加支持,如果用户输入 My Title,我希望它返回 id 的 id1id2。目前它没有返回任何内容,因为没有任何内容完全匹配。

我知道使用 DynamoDB 扫描而不是查询可以实现这一点,但由于我的表有很多项目,在这种情况下进行扫描在性能和成本方面似乎效率很低。

实现这一目标的最简单方法是什么?

最佳答案

您无法使用 DynamoDB 查询来执行此操作。 DynamoDB 查询需要与主键进行精确等于比较。您将不得不使用扫描,正如您所指出的,根据表的大小,扫描可能非常低效且昂贵。

即使扫描高效且便宜,它仍然不是实现搜索功能的好选择。如果您的用户搜索“我的头衔”怎么办? Dynamo 没有用于进行不区分大小写的字符串比较的函数。您必须在表中存储另一个属性,其中包含要扫描和过滤的字段的更易于搜索的版本。

如果您需要真正的搜索功能,那么您将需要使用其他功能。连接 Dynamo 和 ElasticSearch “相对”容易(如果您了解 ElasticSearch)。您可以使用带有 Lambda 触发器的 DynamoDB 流在表更改时插入/更新/删除 ElasticSearch 索引。然后您将针对 ElasticSearch 执行标题搜索。如果您以前使用过 ElasticSearch,那还不错。如果没有,就会有一些学习曲线。

您可能不想听到的另一个选项是放弃 Dynamo 并使用关系数据库,并使用带有一些通配符的 LIKE 查询。

不幸的是,没有一种好方法可以在 Dynamo 之上实现像样的搜索。

关于javascript - DynamoDB 索引查询包括,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51276338/

相关文章:

javascript - eslint:组件定义缺少 displayName

javascript - 如何创建向查询添加 AND 语句的 AND 按钮?

python - 如何使用 boto3 按名称获取 RDS 实例的状态

java - 使用Java在DynamoDb中找不到QueryRequest的SetCount方法

amazon-web-services - 如何在使用 EMR/Hive 将数据从 S3 导入 DynamoDB 时处理引号 (CSV) 中的字段

java - 如何使用 Java DynamoDBMapper 类保存任意结构的文档

javascript - 如何防止在 chrome 中使用 'onbeforeunload' 事件进行双重确认

php - 概念 - 根据 URL 路径提供动态内容?

amazon-web-services - AWS CLI 配置文件与凭证文件

javascript - 使用 AWS javascript sdk 出现 No Access-Control-Allow-Origin 错误