用于可搜索性的键值数据库建模

问题描述

假设我正在建立一个像 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 中支持此访问模式列表是可能的,但这将是痛苦的(并且可能很昂贵)。我建议找到一个专门为搜索而构建的解决方案。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...