父子文档的特点

1. 父/子文档是完全独立的。

2. 父文档更新不会影响子文档。

3. 子文档更新不会影响父文档或者其它子文档。

父子文档的映射与索引

1. 父子关系 type 的建立必须在索引新建或 update-mapping 时候确定好

PUT /company

{"mappings": {"branch": {}, //父文档 type

"employee": {"_parent": {"type": "branch" //子文档 type

}

}

}

}

2. 父文档的索引和普通文档索引一样。

POST /company/branch/_bulk

{"index": { "_id": "london"}}

{"name": "London Westminster", "city": "London", "country": "UK"}

3. 子文档索引必须指定其对应的父文档 ID,作用:

建立父子文档之间的关联

确保子文档能够被索引到父文档所在分片(parent id 作为 route)

PUT /company/employee/1?parent=london //指定 id = london 的父文档

{"name": "Alice Smith","dob": "1970-10-24","hobby": "hiking"}

4. 如果要更改文档的父文档,不能仅仅 update 或者 reindex 旧文档(新的父文档可能在不同分片上),需要先删除旧文档再重新索引。

父子关系的应用

看到 parent-child 关系,我们很容易想到的是像 SQL 那样的各种 JOIN 操作——比如查询某个文档并一并取回所有的父或子文档等。

然而,ES 中不支持类似的 JOIN 查询。即便 child aggregation 也不能做到像 SQL 那样的 JOIN 操作!

在 ES 中的 parent-child 关系基本可以理解为是一个过滤条件,如下:

//查询某文档,只有该文档有"父文档"且满足一定条件才算匹配

{"has_parent": { //文档是否有 parent

"type": "branch", //其 parent 所在 type 必须是 branch

"query": { //其 parent 必须满足以下 query 条件

"match": {"country": "UK"}

}

}//如果满足以上条件,hit 该文档

}//查询某文档,只有该文档有"子文档"且满足一定条件才算匹配

{"has_child": { //文档是否有 child

"type": "employee", //其 child所在 type 必须是 employee

"query": { //其 parent 必须满足以下 query 条件

"match": {"name": "Alice Smith"}

}

}//如果满足以上条件,hit 该文档

}

1. has_child:基于子文档的内容,查找父文档

//请求GET /company/branch/_search

{"query": {"has_child": { //基于 child 的内容,查询满足条件的 parent 文档

"type": "employee","query": { //在 child 中执行 match query操作

"match": {"name": "Alice Smith"}

}

}

}

}//结果

{"took": 2,"timed_out": false,"_shards": {"total": 5,"successful": 5,"failed": 0},"hits": {"total": 1,"max_score": 1,"hits": [

{"_index": "company","_type": "branch", //注意!!!返回的是 parent 的文档

"_id": "london","_score": 1,"_source": {"name": "London Westminster","city": "London","country": "UK"}

}

]

}

}

2. has_parent:基于父文档的内容,查找子文档

//请求 GET /company/employee/_search

{"query": {"has_parent": { //基于 parent 的内容,查询满足条件的 child 文档

"type": "branch","query": { //在 parent 中执行 match query 查询

"match": {"country": "UK"}

}

}

}

}//结果

{"took": 2,"timed_out": false,"_shards": {"total": 5,"successful": 5,"failed": 0},"hits": {"total": 1,"max_score": 1,"hits": [

{"_index": "company","_type": "employee", //注意!!!返回的是 child 的文档

"_id": "1","_score": 1,"_routing": "london","_parent": "london","_source": {"name": "Alice Smith","dob": "1970-10-24","hobby": "hiking"}

}

]

}

}

3. children aggregation:对关联的 child 文档进行聚合操作

//请求 GET /company/branch/_search

{"size" : 0,"aggs": {"country": {"terms": {"field": "country" //以不同的 country 来分组(桶分)

},"aggs": {"employees": {"children": { //children aggregation,子 type 为 employee

"type": "employee"},"aggs": {"hobby": {"terms": {"field": "hobby" //以不同的 hobby 来分组(桶分)

}

}

}

}

}

}

}

}//结果

"aggregations": {"country": {"doc_count_error_upper_bound": 0,"sum_other_doc_count": 0,"buckets": [ //country 聚合结果

{"key": "uk","doc_count": 2,"employees": { //children aggregation 聚合

"doc_count": 1,"hobby": {"doc_count_error_upper_bound": 0,"sum_other_doc_count": 0,"buckets": [ //hobby 聚合结果

{"key": "hiking","doc_count": 1}

]

}

}

}

]

}

}

es父子结构查询_ES 父子文档查询相关推荐

  1. es内嵌文档查询_ElasticSearch 文档的增删改查都不会?

    本文主要是介绍 ElasticSearch 的文档增删改查和批量操作,同时会介绍一些 REST API 返回状态码的具体含义. 我们先来看下这个表: 这个表包含了 Index.Create.Read. ...

  2. 商城项目16_es简介、详解倒排索引、安装es以及kibana、检索es基本信息、增删改查文档

    文章目录 ①. es - 背景.概述.功能.场景 ②. 核心概念 - 索引.类型.文档.映射 ③. es - 详解倒排索引 ④. 安装elasticSearch.kibana 7.4.2 ⑤. 索引操 ...

  3. 初识ElasticSearch(2) -文档查询之match查询 | 分词器

    1. 分词器: 2. match查询: 2.1. 数据准备 - 创建带分词器的索引映射 2.2. 数据准备 - 添加文档 2.3. 数据准备 - 查看文本分词 2.4. 查询 - 映射有分词器的字段查 ...

  4. Python+Streamlit aggrid+MongoDB GridFS构建低代码文档管理应用(文档查询下载实用篇)

    1. Sreamlit aggrid简介 Sreamlit aggrid是Streamlit的Ag-Grid组件的实现,在Python Streamlit框架下,更加灵活的使用表格,包括分组.排序.编 ...

  5. 第11章:MongoDB-CRUD操作--文档--查询

    ①语法 db.collection.find(query, projection) ②参数 query :可选,使用查询操作符指定查询条件 projection :可选,使用投影操作符指定返回的键.查 ...

  6. 【MATLAB】matlab 文档使用 ( 文档查询 | 文档层次 | 自带搜索工具 | 帮助命令 | 学习导引 )

    文章目录 一.matlab 文档查询 二.matlab 文档层次 三.matlab 自带搜索工具 四.matlab 帮助命令 五.matlab 学习导引 一.matlab 文档查询 如果想要使用 co ...

  7. mongodb查询内嵌文档

    mongodb查询内嵌文档 假设有这样一个文档: db.XXX.remove(); db.XXX.insert({"id":1, "members":[{&qu ...

  8. 怎么用源程序把ChemDraw结构复制到Word文档

    在学习化学过程中,不可避免的会接触到各种化学结构.这个时候就需要通过绘制化学结构来进行这方面的学习和传播.ChemDraw Professional 15就可以辅助完成这方面的工作.很多的用户朋友会通 ...

  9. mongodb 查询内嵌文档

    原文:http://www.cnblogs.com/silentjesse/p/3598399.html mongodb查询内嵌文档 假设有这样一个文档: db.XXX.remove(); db.XX ...

最新文章

  1. python3中的单例模式Singleton
  2. RDKit | 比较分子之间的相似性
  3. iOS自动化测试之Appium的安装和使用
  4. 【学习Android NDK开发】Java通过JNI调用native方法
  5. 鸿蒙系统联合,跨界联合 华为鸿蒙系统赋能厨电业
  6. linux服务器家目录,linux服务器根目录空间不足
  7. You need to use a Theme.AppCompat theme (or descendant) with this activity
  8. 利用jieba进行中文分词并进行词频统计
  9. 2016最新PHP燕十八系统实战入门网站视频教程
  10. 测试ai模糊软件,“马赛克视频”还原软件被疯传!实际测试后,效果差距太大!...
  11. 如何从chrome获取你需要的缓存视频
  12. pc端ui图片尺寸_PC端网页尺寸设计一
  13. 印度影星沙鲁克-罕简介
  14. odoo学习笔记(一)
  15. 一亩三分地-每日答题
  16. 【转】定员108的车厢号码分布图
  17. Docker容器化实战第二课 镜像、容器、仓库详解
  18. ecg 幅度_心电图 (ECG) 与光电容积图 (PPG) 基本工作原理,如何测量?
  19. 硬核!8个类手写一个配置中心!
  20. Spring 版本和Jackson版本兼容问题

热门文章

  1. cookie关键字_我遇过的最难的Cookie问题
  2. 【论文速读】RandLA-Net大规模点云的高效语义分割
  3. 使用cmd将磁盘转化为GPT格式
  4. div自己移除自己/移除div下面的所有子元素
  5. 解决vue项目build之后部署到服务器访问的时候出现报错:Uncaught SyntaxError: Unexpected token ‘<‘ chunk-vendors:XXXXXX
  6. windows cmd 查看占用端口号PID并且结束进程
  7. Go的日志模块glog调研笔记
  8. ATS 5.3.0中parent.config配置文件解读
  9. Overall Comparision With WCDMA
  10. K8S - Kubernetes简介