0、ES6.X 一对多、多对多的数据该如何存储和实现呢?
引出问题:
“某头条新闻APP”新闻内容和新闻评论是1对多的关系?
在ES6.X该如何存储、如何进行高效检索、聚合操作呢?
相信阅读本文,你就能得到答案!
1、ES6.X 新类型Join 产生背景
-
Mysql中多表关联,我们可以通过left join 或者Join等实现;
-
ES5.X版本,借助父子文档实现多表关联,类似数据库中Join的功能;实现的核心是借助于ES5.X支持1个索引(index)下多个类型(type)。
-
ES6.X版本,由于每个索引下面只支持单一的类型(type)。
-
所以,ES6.X版本如何实现Join成为大家关注的问题。
幸好,ES6.X新推出了Join类型,主要解决类似Mysql中多表关联的问题。
2、ES6.X Join类型介绍
仍然是一个索引下,借助父子关系,实现类似Mysql中多表关联的操作。
3、ES6.X Join类型实战
3.1 ES6.X Join类型 Mapping定义
Join类型的Mapping如下:
核心
-
1) "my_join_field"为join的名称。
-
2)"question": "answer" 指:qustion为answer的父类。
1PUT my_join_index
2{
3 "mappings": {
4 "_doc": {
5 "properties": {
6 "my_join_field": {
7 "type": "join",
8 "relations": {
9 "question": "answer"
10 }
11 }
12 }
13 }
14 }
15}
3.2 ES6.X join类型定义父文档
直接上以下简化的形式,更好理解些。
如下,定义了两篇父文档。
文档类型为父类型:"question"。
1PUT my_join_index/_doc/1?refresh
2{
3 "text": "This is a question",
4 "my_join_field": "question"
5}
6PUT my_join_index/_doc/2?refresh
7{
8 "text": "This is another question",
9 "my_join_field": "question"
10}
3.3 ES6.X join类型定义子文档
路由值是强制性的,因为父文件和子文件必须在相同的分片上建立索引。
"answer"是此子文档的加入名称。
指定此子文档的父文档ID:1。
1PUT my_join_index/_doc/3?routing=1&refresh
2{
3 "text": "This is an answer",
4 "my_join_field": {
5 "name": "answer",
6 "parent": "1"
7 }
8}
9PUT my_join_index/_doc/4?routing=1&refresh
10{
11 "text": "This is another answer",
12 "my_join_field&#