第 7 章 · 复杂形态:关系、嵌套与空间数据 章节摘要:不是所有文档都孤身旅行:工单带着回复数组、商品挂着变体规格、门店背着经纬度。本章处理两种复杂形态——对象数组的关系保全(object 会拍平、nested 独立建索引、join 走父子文档)与地理数据的检索(geopoint 存坐标、距离与边界两种问法)。这一章是第 1 章数据模型的进阶篇:形态选错,查询就会说谎。 学习目标 阅读完本章,你应当能够: 复现"object 数组拍平导致跨对象误匹配"的翻车现场,解释拍平的存储机理。 用 nested 类型保全数组内对象的独立性,写出 nested 查询与嵌套聚合,并说明它的索引代价。 说明父子文档(join 字段)与 nested 的三点差别,按更新频率选型。
章节摘要:不是所有文档都孤身旅行:工单带着回复数组、商品挂着变体规格、门店背着经纬度。本章处理两种复杂形态——对象数组的关系保全(object 会拍平、nested 独立建索引、join 走父子文档)与地理数据的检索(geo_point 存坐标、距离与边界两种问法)。这一章是第 1 章数据模型的进阶篇:形态选错,查询就会说谎。
阅读完本章,你应当能够:
金句:引擎只对它理解的结构负责——你给它拍平的数组,它就还你拍平的答案。
三个回合讲清关系建模:object 默认拍平引发的"张冠李戴";nested 如何把每个子对象变成独立小文档;更新频繁时改用 join 父子文档。附一次选型推演的完整过程。
geo_point 的两种录入形态、距离检索与边界框检索的写法、地理聚合的两种桶。末尾简短巡礼反向搜索与跨集群检索这些"冷门但关键"的能力,作为高级特性的地图边界。
两节分别处理"关系复杂"与"空间复杂",都是第 1 章文档模型的延伸形态。7.1 的选型框架(按更新频率与查询模式)同样适用于 7.2 的地理建模(点、形状、网格的粒度选择),方法论一以贯之:先想清楚查询形态,再决定存储形态。
7.1 关系形态 object/nested/join ──► 7.2 空间形态 geo_point │ │ └─► 第3章 映射决定一切 └─► 第9章 附近网点功能落地
| 考核点 | 达标标准 | 对应小节 |
|---|---|---|
| 复现拍平陷阱 | 构造对象数组数据,演示 object 跨对象误匹配的查询 | 7.1 |
| nested 查询 | 写出锁定子文档内匹配的查询,并用 inner_hits 取回命中项 | 7.1 |
| 三选项选型 | 按更新频率与查询模式在 object、nested、join 间选择并说明代价 | 7.1 |
| 距离检索 | 写出 geo_point 映射与三公里圈查询,配距离排序 | 7.2 |
| 地理聚合 | 按距离环带分桶统计网点覆盖 | 7.2 |