前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ElasticSearch嵌套模型基本操作

ElasticSearch嵌套模型基本操作

作者头像
我是攻城师
发布2018-05-14 17:09:51
1.9K0
发布2018-05-14 17:09:51
举报
文章被收录于专栏:我是攻城师

上篇介绍了ES嵌套模型使用场景和优缺点,本篇接着介绍关于ES嵌套的索引一些基本的操作,包括插入,追加,更新,删除,查询单独放下一篇文章介绍。

首先来看下如何添加数据,上篇提到了我们项目中有三个实体类分别是User,Quest,Kp。其关系是一对多对多,User里面有个List<Quest>字段可以包含多个Quest对象而每一个Quest对象又包含一个List<Kp>字段可以包含多个Kp实体,每个实体类本身又可以拥有多个自己的属性字段。

在这里其实也能感受到用动态索引模板的好处,就是我不要关注到底有多少个字段,我的实体类里面随时可以新增一个字段或多个字段进行索引,当然前提是你把动态模板的schema给定义好,这过程中也遇到一些问题,后面会在相关的文章中介绍。

现在我想添加"一条数据"进入索引,注意这里的一条数据,指的是向一次发送一次索引,因为嵌套索引它的嵌套文档每一个都是独立的document,所以看起来你向es索引了一条数据到其服务端后,doc的数量会大于1,这个其实很正常,下面解释一下。

现在我想索引一条User数据,但是User下面又包含了5个Quest实体,而每个Quest实体又包含了2个Kp知识点,那么最终到es里面显示的文档数量=1+5*2=11条数据,所以看起来你发送的一条数据,其实es服务端会把其拆分成独立的document,但是es会在内部标记他们的关系,在进行检索时可根据需要返回所有数据或者指定想要返回的数据。

(1)下面看下,如何添加一条数据的核心代码:

可以发现插入的方法还是比较简单清晰的,就是将一个Java Bean转成json后进行索引,只要服务端有配置描述其schemal就可以成功插入

(2)在第二层嵌套数据里面添加一条新的数据到quests中

注意append操作,需要用到script来完成。

上面的代码,是向已经存在某个User给它新增了一个Quest对象,注意这个Quest对象里面,如果有Kp的数据,依旧也可以添加进来。

(3)在第二层嵌套数据里面删除一条quests数据

(4)在第三层嵌套数据里面添加一条Kp数据

(5)在第三层嵌套数据里面删除一条Kp数据

(6)更新第三层嵌套里面的数据

A:如果是字段数比较多,大范围更新,建议直接删除后添加

B: 如果字段数比较少,小范围更新,就使用下面的局部更新的API即可

(7)同理更新第二层嵌套里面的数据

总结:

本篇介绍了ES嵌套索引的添加,修改,删除的操作,我们不难发现都是用script脚本来完成的,ES默认用的是Groovy如果想更加深入的了解script脚本的各种语法,建议直接熟悉下Groovy的语法。虽然理论上我们通过script脚本来完成对无限嵌套索引的操作,但实际应用开发中,需要注意几点:

(1)不要出现太多层的嵌套结构,建议不要超过3级

(2)每层的嵌套结构List里面,不建议存储太多的数据,如果存的太多,删除,更新操作的时间都会是线性的,因为es需要遍历整个List(最坏情况下)找到你需要删或者改的数据

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2017-03-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 我是攻城师 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档