javascript - DynamoDB 索引查询包括
问题描述
我正在尝试查询 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 的id1
AND id2
。目前它什么都不返回,因为没有什么完全匹配的。
我知道这可以通过使用 DynamoDB 扫描而不是查询来实现,但由于我的表有这么多项目,在这种情况下进行扫描似乎在性能和成本方面效率很低。
实现这一目标的最简单方法是什么?
解决方案
您将无法使用 DynamoDB 查询来执行此操作。DynamoDB 查询需要与主键进行精确等于比较。您将不得不使用扫描,正如您所指出的,这可能会非常低效且昂贵,具体取决于表的大小。
即使它既高效又便宜,扫描仍然不是实现搜索功能的好选择。如果您的用户搜索“我的标题”怎么办?Dynamo 没有进行不区分大小写的字符串比较的功能。您必须在表中存储另一个属性,其中包含要扫描和过滤的字段的更易搜索版本。
如果您需要真正的搜索功能,那么您将需要使用其他功能。连接 Dynamo 和 ElasticSearch(如果您了解 ElasticSearch)“相对”容易。当表更改时,您可以使用带有 Lambda 触发器的 DynamoDB 流来插入/更新/删除 ElasticSearch 索引。然后,您将对 ElasticSearch 执行标题搜索。如果您以前使用过 ElasticSearch,那还不错。如果没有,有一点学习曲线。
您可能不想听到的另一种选择是放弃 Dynamo 并使用关系数据库,并使用带有一些通配符的 LIKE 查询。
不幸的是,没有一种很好的方法可以在 Dynamo 之上实现体面的搜索。
推荐阅读
- ios - 在 iOS 上通过 Messages 发送和接收自定义文件包的正确方法是什么?
- javascript - 响应中“Access-Control-Allow-Origin”标头的值不能是通配符“*”,但在我的服务器中它不是通配符
- php - Laravel 队列即使在尝试计数后仍处于处理状态
- azure-functions - Azure 功能键会过期吗?
- assembly - 从 MOV 指令更改为 ADD 或 SUB 指令
- maven - 无法使用命令行构建 maven 项目
- regex - 使用正则表达式和 sed 降低驼峰大小写的蛇形案例
- python - 如何通过plotly python绘制多个y轴
- javascript - 我不小心删除了 minio 服务器上的图像。是否可以恢复 minio 备份(有和没有 docker)?
- ios - 如何一次更改collectionViewCells中UITextView的字体大小?