0、概要
在Elasticsearch实战场景中,我们或多或少会遇到嵌套文档的组合形式,反映在ES中称为父子文档。
父子文档的实现,至少包含以下两种方式:
1)父子文档
父子文档在5.X版本中通过parent-child父子type实现,即:1个索引对应多个type;
6.X+版本已经不再支持一个索引多个type,6.X+的父子索引的实现改成Join。
2)Nested嵌套类型
本文通过一个例子将Nested类型适合解决的问题、应用场景、使用方法串起来,
文中所有的DSL都在Elasticsearch6.X+验证通过。
1、Elasticsearch 数据类型全景概览
2、从一个例子说起吧
2.1 问题背景
在elasticsearch中,我们可以将密切相关的实体存储在单个文档中。 例如,我们可以通过传递一系列评论来存储博客文章及其所有评论。
举例:
{ "title": "Invest Money", "body": "Please start investing money as soon...", "tags": ["money", "invest"], "published_on": "18 Oct 2017", "comments": [ { "name": "William", "age": 34, "rating": 8, "comment": "Nice article..", "commented_on": "30 Nov 2017" }, { "name": "John", "age": 38, "rating": 9, "comment": "I started investing after reading this.", "commented_on": "25 Nov 2017" }, { "name": "Smith", "age": 33, "rating": 7, "comment": "Very good post", "commented_on": "20 Nov 2017" } ]}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
如上所示,所以我们有一个文档描述了一个帖子和一个包含帖子上所有评论的内部对象评论。
但是Elasticsearch搜索中的内部对象并不像我们期望的那样工作。
2.2 问题出现
现在假设我们想查找用户{name:john,age:34}评论过的所有博客帖子。 让我们再看一下上面的示例文档,找到评论过的用户。
name | age |
---|---|
William | 34 |
John | 38 |