elasticsearch简介
elasticsearch一直以来受大众青睐,特别适用于大数据量、高频繁查询的业务逻辑。大家都知道ES的数据是以文档的形式保存的,在保存数据的时候ES的分词系统会将我们的数据通过倒排索引进行处理,以便于我们后续高效的查询。

多个实体对象关联
在实际业务过程中我们的各个实体对象都相互关联,那么在ES的世界里我们如何处理这些关联关系呢?ES中一般有普通文档、嵌套文档、父子文档,这些文档都能满足父子对象的关系。但是,普通一对多文档有子对象边界值问题,嵌套文档修改父文档必须修改整个文档,父子文档则可以任意修改文档且不影响其他关系文档。今天我们就来看看ES的父子文档。

什么是父子文档
父子文档就是将父文档和子文档关联起来,就如同关系数据库里面 join 一样。父子文档都绑定在同一个索引上,但是分属于两个独立的文档。

优势与劣势
优点:
1、父子文档相互独立
2、修改父文档索引不影响子文档;增删改任意的子文档,父文档和其他子文档不受影响
3、子文档可以从属于多个父文档

缺点:
1、索引结构复杂,封装操作脚本难度较大
2、为保证父子文档被分配到同一个分片,新增子文档必须添加和父文档一致的路由

小试牛刀
比如我们产品下有多个渠道
1、定义如下父子文档索引:
这里用到了 joinFiled 自定义字段进行过滤,此字段我们创建索引时可以自由声明,当前里面的父子文档标识( “product”: “channel”)也是自由声明。

PUT productPUT product/_mapping
{"properties":{"name": {"type":"keyword"},"productId": {"type":"integer"},"joinFiled":{"type":"join","relations":{"product": "channel"}}}
}

2、查看索引结构

GET product

3、新增父文档数据

#新增父文档
PUT product/_doc/11001
{"name":"产品1","productId":11001,"joinFiled":{"name": "product"}
}

4、新增子文档,注意路由取父文档id保证父子文档在同片。

#新增子文档
PUT product/_doc/12001?routing=11001
{"name":"渠道1","joinFiled":{"name": "channel","parent": 11001}
}

“parent”: 11001 >> 将渠道子文档与产品父文档关联起来。
实际业务中一般子文档保存有父文档的id,那么这个父id就是关联的关键。

5、查询文档数量确定父子文档是否独立

#查询文档数据
GET product/_search
{}

6、根据父文档查询子文档,

#根据子父档查询子文档
GET product/_search
{"query": {"bool": {"must": [{"term": {"joinFiled": {"value": "channel"}}},{"has_parent": {"parent_type": "product","query": {"bool": {"must": [{"term": {"name": {"value": "产品1"}}}]}}}}]}}
}

7、根据子文档查询父文档

#根据子文档查询父文档
GET product/_search
{"query": {"bool": {"must": [{"term": {"joinFiled": {"value": "product"}}},{"has_child": {"type": "channel","query": {"bool": {"must": [{"term": {"name": {"value": "渠道1"}}}]}}}}]}}
}

父子文档是将两个独立的文档关联起来,操作父子文档关系不会影响其他文档。父子文档关联是在创建索引时进行申明,他们同属于同一个索引却不是同一个文档。

elasticsearch 父子文档相关推荐

  1. Elasticsearch学习-父子文档

    本文以Elasticsearch 6.8.4版本为例,介绍Elasticsearch父子文档的使用. 上一篇文章介绍了Elasticsearch的嵌套文档,这一篇来介绍另外一种关系文档,父子文档. 1 ...

  2. ElasticSearch 7.6 多子文档过滤查询

    一.es 7.x 父子文档的 field 及官方文档地址 我找了半天,原来官方本来就有教程,只不过专有名词没用对,所以在找官方文档的时候,一直徘徊不前,不说了,先去弄写代码了.后面有时间了在继续写. ...

  3. ElasticSearch(四):ES nested嵌套文档与父子文档处理

    对于复杂的嵌套字段处理使用nested来避免数据扁平化处理,使用数据如下: PUT /user_index {"mappings": {"properties" ...

  4. elasticsearch 父子文档使用must not 正确姿势

    需求描述: 1.基于elasticsearch 父子文档进行子条件查询父文档 2.需要查询出子文档不存在的父文档 已知文档结构: 1.父文档clue_list 关联很多的子文档,我们用roam子文档做 ...

  5. Elasticsearch官方文档

    官方文档地址 https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html 1.0.0 设置Elasticsea ...

  6. Solr嵌套子文档的弊端以及一种替代方式

    背景:在考察了多种工具后,我们决定使用solr来作为多标签用户管理体系的查询方案. 原计划:电话,call客,跟进等等记录上报到kafka,然后通过flume+morphline录入到solr中.每一 ...

  7. elasticsearch 路由文档到分片

    路由文档到分片 当你索引一个文档,它被存储在单独一个主分片上.Elasticsearch是如何知道文档属于哪个分片的呢?当你创建一个新文档,它是如何知道是应该存储在分片1还是分片2上的呢? 进程不能是 ...

  8. VC mfc 多文档程序更改子文档标题名

    VC++新建一个多文档MDI工程:输入工程名,mditest1:其他全部默认:生成项目,运行了看一下,如下: 现在要更改子文档标题:进入类向导,按下图,找到文档类的OnNewDocument函数,进入 ...

  9. 公文转成电子文档需要注意的事项

    事业单位之间会互相传发一些公文,接收单位会对公文进行分析,并给出解决方案,涉及到把公文转成电子文档,目前通过人工敲字实现. 转成电子文档后,需要做好版本管理,几月几号那个部门的文档,几月几日接受了什么 ...

最新文章

  1. 算法笔记_157:算法提高 c++_ch02_01(Java)
  2. python判断点在四边形内
  3. 遍历map几种方式及应用
  4. bzoj 1999: [Noip2007]Core树网的核【树的直径+单调队列】
  5. javascript 西瓜一期 12 八进制的数数进位解析
  6. 【华为云技术分享】如何度量前端项目研发效率与质量(上)
  7. 某些微型计算机使用Pentium,2010四川省计算机等级考试二级理论考试试题及答案...
  8. GitHub 的 12 个实用技巧,你 get 了几个?
  9. 笔记(2)-文本挖掘与机器学习
  10. c++输出的值精确到小数点后5位_直击灵魂——圆周率小数点后3位到12411亿位到底有啥用?...
  11. Windows清理助手系统诊断使用教程
  12. 对所有员工的薪水按照salary降序进行1-N的排名
  13. 方差递推公式_常见递推公式(数学)
  14. 计算机图形图像处理应用教程,计算机图形图像处理应用教程
  15. NoteExpress免费版只7个引文样式#NoteExpress免费版新增引文样式
  16. 使用UltraISO刻录自己的音乐CD步骤
  17. JS中attr和prop区别
  18. 【HDR学习】苹果EDR技术洞察(二)
  19. 华硕u4000u 重装window7 重装win7 重装window10 重装win10 重装系统 戴尔 联想 鸿基 重装系统远程协助
  20. python 排名函数_分数排名(Python),成绩,排序,python

热门文章

  1. K-means聚类最优k值的选取
  2. HTML 自定义实现emoji
  3. 【LTspice】005 伯德图绘制
  4. 汽车安全标准ISO-26262以及等级ASIL
  5. sklearn数据预处理(二)非线性转换
  6. java ssi_快速部署SSI框架
  7. mysql查询5分钟内的数据
  8. Poi实现Excel导出
  9. IOS开发学习之路--第一篇--TOM猫
  10. 这个横行霸道的美食,也是中秋节的一大特色,我用Python爬取京东1546条大闸蟹商品数据带大家看看