【发布时间】:2016-05-11 11:00:10
【问题描述】:
我有 4 张桌子:
- 国家
- 状态
- 城市
- 地址
这些表通过 ids 相关,其中国家是最高父级:
- state.countryId
- city.stateId
- address.cityId
我想在我的应用程序中集成弹性搜索并想知道索引这些表的最佳方法是什么?
我应该为每个表创建 1 个索引,以便为每个国家、州、城市和地址分别创建 1 个索引吗?
或者我应该对表进行非规范化并仅创建 1 个索引并以冗余方式存储所有数据?
【问题讨论】:
我有 4 张桌子:
这些表通过 ids 相关,其中国家是最高父级:
我想在我的应用程序中集成弹性搜索并想知道索引这些表的最佳方法是什么?
我应该为每个表创建 1 个索引,以便为每个国家、州、城市和地址分别创建 1 个索引吗?
或者我应该对表进行非规范化并仅创建 1 个索引并以冗余方式存储所有数据?
【问题讨论】:
ES 不怕你的数据冗余,所以我会明确地去规范化,以便每个文档代表一个地址,如下所示:
{
"country_id": 1,
"country_name": "United Stated of America",
"state_id": 1,
"state_name": "California"
"state_code": "CA",
"city_id": 1,
"city_name": "San Mateo"
"zip_code": 94402,
"address": "400 N El Camino Real"
}
然后,您可以根据需要汇总任何城市、州、国家/地区字段的数据。
您的里程可能会有所不同,因为它最终取决于您希望如何查询/聚合您的数据,但在单个索引中查询这样的地址数据比点击多个索引要容易得多。
【讨论】:
{ "country_id": 1, "country_name": "United States of America", "state_id": , "state_name": "state_code": , "city_id": , "city_name": "zip_code": , "address": }
country_* 字段。
我喜欢 Val 的回答,这是最直接的选择。但如果你真的想减少重复(例如最小化磁盘大小),你可以使用parent-child 映射。不过,它会使索引和查询更加冗长。我仍然建议使用“平面”映射。
您问“如果您需要个别国家或州或城市的记录怎么办?”,我建议添加一个附加字段(not_analyzed 或整数),以指示此文档代表的层次结构级别。没有与较低层次结构相对应的字段很好。这样您就可以轻松地对仅搜索州或国家/地区进行过滤。
【讨论】:
Here 是@adrien-grand 的一篇非常有用的文章,详细阐述了创建多个索引或更少索引和多种类型之间的权衡问题。
希望对你有帮助!
【讨论】: