问题描述
假设我正在建立一个像 eBay(或其他东西)这样的市场,
使用看起来像这样的数据(伪代码):
public class Item {
Double price;
String geoHash;
Long startAvailabilty; // timestamp
Long endAvailabilty; // timestamp
Set<Keywords> keywords;
String category;
String dateCreated; // iso date
String dateUpdated; // iso date
Integer likes;
Boolean isActive;
}
项目与字段数据(标题、价格、时间戳范围)以及一些文本(描述)一起存储。然后我需要根据以下内容进行过滤:
- 价格范围(例如 100-200)
- 位置(例如以 GeoHash 前缀开头)
- 在给定的毫秒时间戳之间(例如,每条记录都有一个开始和结束日期)——例如物品有效期
- 有一个给定的关键字(每条记录都有一个在存储前预处理的关键字数组)
- 有给定的类别
- 创建日期和更新日期(这很常见)
- 具有给定的关键字文本(我认为这不太可能,因为这是全文搜索)
我想根据以下内容对结果进行排序:
- 点赞数优先(每条记录都存储了点赞数)
- 首先是最新的或最近创建的
- 仍处于活动状态(每条记录是否处于活动状态都有一个布尔值)
应该如何将其建模/存储在键值数据库中,以便可以使用上面给定的查询进行检索?即不使用任何模式(无模式)
解决方法
当您的访问模式需要以多种不同方式(例如按标签提取、按日期提取、按类别提取等)获取相同信息时,您将与 DynamoDB 进行一场艰苦的战斗。通过巧妙的数据建模,您可以在可以支持的访问模式上取得很大进展。但是,作为键/值存储,搜索并不是 DynamoDB 的最佳选择。
解决问题的常用方法是使用专门搜索工具,例如ElasticSearch。您仍然可以将数据存储在 DynamoDB 中,但使用 ElasticSearch 来支持您的搜索需求。 AWS 甚至还有一个 article on this topic,它描述了您可以如何使用 DynamoDB 流来保持 ElasticSearch 索引的最新状态。
虽然单独在 DynamoDB 中支持此访问模式列表是可能的,但这将是痛苦的(并且可能很昂贵)。我建议找到一个专门为搜索而构建的解决方案。