es父子结构查询_ES 父子文档查询

本文详细介绍了Elasticsearch中的父子文档特性,包括它们的独立性、映射与索引方法。重点讲解了如何通过`has_parent`和`has_child`查询操作来实现类似SQL的JOIN效果,以及`children`聚合操作。同时,对比了ES6.x之后父子结构的变化。
摘要由CSDN通过智能技术生成

父子文档的特点

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/?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 该文档

}

//查询某文档&#x

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值