如何对AWS CloudSearch文档的关系数据进行非规范化?

时间:2015-05-04 22:09:07

标签: amazon-web-services amazon-cloudsearch

AWS CloudSearch希望您将数据的扁平化文档发送到搜索索引,如下所示:

[
 {"type": "add",
  "id":   "123456",
  "fields": {
     "account_id": "123456",
     "name": "foo",
     "addresses": []
  }
 }
]

假设我有一个带有accounts表和addresses表的数据库。

每个addresses有许多accountaddresses表包含以下字段:

  • ADDRESS_1
  • address_2
  • 城市
  • 状态
  • 拉链
  • account_id(参考字段)

如何在CloudSearch文档结构中对地址进行反规范化,以便搜索帐户和地址中的所有列?

或者我应该为每个表创建一个单独的搜索域吗?

1 个答案:

答案 0 :(得分:0)

我假设你的用例是:

  • 按帐户ID
  • 检索地址
  • 按地址检索account_ids
  • 在特定城市/州/邮政编码中查找帐户

我会推荐以下两件事:

  • 将每个地址编入索引

    我会将每个地址编入索引作为单独的文档。有一个单独的 每个地址的doc将使您能够保持关系 在不同的领域之间(如果你有一个数组,你会失去 城市和每个帐户的一系列州。)

  • 分别为每个字段编制索引

    我会分别为每个字段(城市,州等)编制索引。打破每个字段将使您能够独立搜索它们(例如,获取俄亥俄州克里夫兰市的所有地址),将它们用作方面,根据它们提高分数等。

以下是我提出的架构中的一些文档示例:

[
 {"type": "add",
  "id":   "<see below>",
  "fields": {
     "account_id": "123456",
     "name": "John Smith",
     "address_1": "1 Main St",
     "address_2": "Apt 1",
     "city": "Davenport",
     "state": IA,
     "zip": 52081
  }
 },
 {"type": "add",
  "id":   "<see below>",
  "fields": {
     "account_id": "123456",
     "name": "John Smith",
     "address_1": "2 Elm St",
     "city": "Lincoln",
     "state": NE,
     "zip": 23452
  }
 }
]

生成文档ID:

请注意,您需要一些非随机方式来构建唯一的document_ids(每个帐户+地址唯一,而不仅仅是每个帐户)。像account_id加上地址,城市,州,邮政编码的哈希值可以使用,或者您可以在表格中添加另一列来唯一标识它们(我更喜欢后者)。