实战 Elasticsearch6 的 join 类型
欢迎访问我的 GitHub
这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos
本篇概览
《Elasticsearch 实战》(英文名 Elasticsearch IN ACTION)是经典 es 教程,对应 demo 源码地址为:https://github.com/dakrone/elasticsearch-in-action ,最新分支 6.x,在使用源码时,发现索引_doc 的静态映射脚本增加了一个类型为 join 的字段,如下所示,:
这是 es6 新增的类型,一起来通过实战学习这个 join;
环境信息
操作系统:Ubuntu 18.04.2 LTS
elasticsearch:6.7.1
kibana:6.7.1
《Elasticsearch 实战》demo 源码下载地址
本文用到的源码一共两个文件,一个是创建静态映射的 mapping.json, 另一个是创建文档的 populate.sh , 地址分别如下:
https://github.com/dakrone/elasticsearch-in-action/blob/6.x/mapping.json
https://github.com/dakrone/elasticsearch-in-action/blob/6.x/populate.sh
上述文件的用法:下载到同一个目录,执行命令**./populate.sh 192.168.1.101:9200** ,"192.168.1.101:9200"是 es6 的 http 地址和端口;
官方说法
官方对 join 类型的说明如下:
我的理解:
join 类型用于建立索引内文档的父子关系;
用父子文档的名字来表示关系;
接下来看看《Elasticsearch 实战》的 demo 中是怎么使用这个字段的;
《Elasticsearch 实战》的 demo
demo 中部分文档的创建脚本如下所示:
如上所示,id 为 1 的记录,其 relationship_type 字段的值为"group",id 为 2 的记录,relationship_type 字段的值不是字符串,而是对象,parent 为 1 表示父文档 id 为 1,name 为"event"表示父子关系是"group:event"类型;
注意:上述第二个文档的地址中携带了 routing 参数,以保持父子在同一个分片,这是在使用 join 类型是要格外注意的地方;
接下来,确保前面提到的 populate.sh 脚本已经执行,使得_doc 索引及其文档数据在 es 环境中准备好,就可以实战了,实战环境是 Kibana 的 Det Tools:
查找所有父类型为"group"的文档(结果是子文档):
执行如下脚本:
可以得到所有父类型为"group"的子文档:
查找所有子类型为"event"的文档(结果是父文档)
执行如下脚本:
可以得到所有子类型为"event"的文档:
查找 parent 的 id 等于 1 的子文档
执行如下脚本:
可以得到所有 parent 的 id 等于 1 的子文档:
用 script_fields 简化返回内容
前面的查询,返回的内容是整个_source,如果不需要全部内容,可以用 script_fields 来简化;
查找所有父文档 ID 等 1 的的子文档,并且返回内容只有三个字段:父文档 ID、子文档 ID、子文档 title 字段:
得到结果如下:
聚合
执行以下查询,会将所有父文档为 group 的子文档做桶聚合聚合:
得到的结果如下,按照父文档 ID 得到聚合结果:
以上就是 join 类型的主要实战内容了,希望能帮助您理解这个新的类型;
欢迎关注 InfoQ:程序员欣宸
版权声明: 本文为 InfoQ 作者【程序员欣宸】的原创文章。
原文链接:【http://xie.infoq.cn/article/d08492fe944240de7240e79ef】。文章转载请联系作者。
评论