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

父子文档的特点

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

}

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

{

"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": ,

"timed_out": false,

"_shards": {

"total": ,

"successful": ,

"failed":

},

"hits": {

"total": ,

"max_score": ,

"hits": [

{

"_index": "company",

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

"_id": "london",

"_score": ,

"_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": ,

"timed_out": false,

"_shards": {

"total": ,

"successful": ,

"failed":

},

"hits": {

"total": ,

"max_score": ,

"hits": [

{

"_index": "company",

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

"_id": "",

"_score": ,

"_routing": "london",

"_parent": "london",

"_source": {

"name": "Alice Smith",

"dob": "1970-10-24",

"hobby": "hiking"

}

}

]

}

}

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

//请求 GET /company/branch/_search

{

"size" : ,

"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": ,

"sum_other_doc_count": ,

"buckets": [ //country 聚合结果

{

"key": "uk",

"doc_count": ,

"employees": { //children aggregation 聚合

"doc_count": ,

"hobby": {

"doc_count_error_upper_bound": ,

"sum_other_doc_count": ,

"buckets": [ //hobby 聚合结果

{

"key": "hiking",

"doc_count":

}

]

}

}

}

]

}

}

ElasticSearch 6.x 父子文档[join]分析

ES6.0以后,索引的type只能有一个,使得父子结构变的不那么清晰,毕竟对于java开发者来说,index->db,type->table的结构比较容易理解. 按照官方的说明,之前一个索 ...

elasticsearch 父子文档(十一)

说明 需求 一个产品多个区域销售 每个区域有自己的价格, 方式1冗余行,a 产品分别在  area1 area2 area3区域销售 a产品就会生成3条产品数据 搜索id去重就行了,但是问题就是 聚合 ...

Elasticsearch必知必会的干货知识一:ES索引文档的CRUD

​ 若在传统DBMS 关系型数据库中查询海量数据,特别是模糊查询,一般我们都是使用like %查询的值%,但这样会导致无法应用索引,从而形成全表扫描效率低下,即使是在有索引的字段精确值查找,面对海量数 ...

Elasticsearch增删改查 之 —— mget多文档查询

之前说过了针对单一文档的增删改查,基本也算是达到了一个基本数据库的功能.本篇主要描述的是多文档的查询,通过这个查询语法,可以根据多个文档的查询条件,返回多个文档集合. 更多内容可以参考我整理的ELK文 ...

Elasticsearch文档查询

简单数据集 到目前为止,已经了解了基本知识,现在我们尝试用更逼真的数据集,这儿已经准备好了一份虚构的JSON,关于客户银行账户信息的.每个文档的结构如下: { , , "firstname& ...

SpringMVC MongoDB之“基本文档查询(Query、BasicQuery)”

一.简介 spring Data  MongoDB提供了org.springframework.data.mongodb.core.MongoTemplate对MongoDB的CRUD的操作,上一篇我 ...

Spring Data MongoDB 三:基本文档查询(Query、BasicQuery)(一)

一.简单介绍 Spring Data  MongoDB提供了org.springframework.data.mongodb.core.MongoTemplate对MongoDB的CRUD的操作,上一 ...

Spring Data MongoDB 三:基本文档查询(Query、BasicQuery

一.简介 spring Data  MongoDB提供了org.springframework.data.mongodb.core.MongoTemplate对MongoDB的CRUD的操作,上一篇我 ...

随机推荐

JAVA 语法基础综合练习——学生成绩管理系统

代码如下:package com.lovo.manager; import java.util.Scanner; /** * 学生管理 * * @author Administrator * */ p ...

Spring和cxf3的整合,以maven的方式

一.引入cxf3 我这里使用的是最新的版本cxf3.1.8 引入cxf3需要在pom.xml加入如下内容: org.apache.c ...

BPMN这点事-BPMN扩展元素

什么是BPMN扩展元素?我们为什么要从BPMN元素中界定出一个扩展元素的子集?BPMN扩展元素是我们平时使用频率不高的BPMN元素,这些元素更多的面向开发人员而不是业务人员,它们强调流程执行的细节,例 ...

Maven学习:常用mvn命令

转自:http://blog.csdn.net/lfsfxy9/article/details/12200915 Maven 在线:

[Leetcode][Python]52: N-Queens II

# -*- coding: utf8 -*-'''__author__ = '[email protected]' 52: N-Queens IIhttps://oj.leetcode.com/ ...

Javascript百学不厌-递归

虽然偶尔也用过,但是从来没具体来整理过 普通递归: function fac(n) { ) ; ); } fac() 这是个阶乘.但是占用内存,因为: fac(5) (5*fac(4)) (5*(4* ...

Smart-image通过SoftReference提高性能

文章导读: 文件介绍了常见的图片下载开源插件smart-image, 由于移动设备硬件受限,因此Android的相关app都要考虑到性能的关系, 所以很多的第三方插件都使用到了缓存cache技术,本人 ...

Actifio中如何分析Oracle备份恢复的报错

场景不同,可以分析的日志不同. 有关oracle备份 (L0/L1) 或者Oracle Log smart backups的日志:UDSAgent.log (on target host locate ...

公众号第三方平台开发 教程六 代公众号使用JS SDK说明

公众号第三方平台开发 教程一 创建公众号第三方平台 公众号第三方平台开发 教程二 component_verify_ticket和accessToken的获取 公众号第三方平台开发 教程三 微信公众号 ...

Qt中(图片)资源的使用方式

Qt中使用图片资源的方法有很多种,以前我一直分不清各种之间的区别和Qt相应的处理机制,后来遇到一些实际的问题,然后再加上查阅源码和资料,总算弄明白一些事情,但是本文仅仅是个人理解,如有错误之处请告诉我 ...

你可能感兴趣的:(es父子结构查询)