01.ES复杂类型
1.1 背景说明
https://blog.csdn.net/laoyang360/article/details/82950393
-
问题背景
- 在elasticsearch中,我们可以将密切相关的实体存储在单个文档中。
- 例如,我们可以通过传递一系列评论来存储博客文章及其所有评论。
-
如下,有一个文章,和这个文章相关的所有评论
-
现在假设我们想查找用户{name:john,age:34}评论过的所有博客帖子
name | age |
---|---|
William | 34 |
John |
38 |
Smith | 33 |
1.2 文章示例
1 | { |
02.自动创建mapping方式测试
2.1 创建索引
1 | POST /article/1 |
2.2 查看自动生成的类型
GET /article/_mapping
1 | { |
2.3 查询
- 现在假设我们想查找用户{name:john,age:34}评论过的所有博客帖子
- 显然评论中,没有这条数据,但是我们过滤后的结果却让人惊奇
name | age |
---|---|
William | 34 |
John |
38 |
Smith | 33 |
2.4 过滤结果却可以找到数据
1 | GET /article/_search |
2.5 分析原因
- elasticsearch中的内部对象无法按预期工作,这里的问题是elasticsearch(lucene)使用的库没有内部对象的概念
- 因此内部对象被扁平化为一个简单的字段名称和值列表。
- 我们的文档内部存储为:
- 您可以清楚地看到,comments.name和comments.age之间的关系已丢失。
- 这就是为什么我们的文档匹配john和34的查询
1 | { |
2.6 nested类型索引存储变化
1 | { |
03.如何解决呢?
官方地址:
https://www.elastic.co/guide/en/elasticsearch/reference/7.10/nested.html
- 要解决这个问题,我们只需要对elasticsearch的映射进行一些小改动。
- 如果您查看索引的映射,您会发现comments字段的类型是object。
- 我们需要更新它的类型为nested。
3.1 创建nested类型索引
- 我们可以通过运行以下查询来简单地更新索引的映射
1 | PUT /article_new |
3.2 nested添加数据
GET /article_new/_search
## 测试查询所有数据
1 | PUT /article_new/_doc/1 |
3.3 使用nested需要方式查询
-
将映射更改为Nested类型后,我们可以查询索引的方式略有变化。
-
我们需要使用Nested查询。
-
ame age William 34
John
38 Smith 33
1 | GET /article_new/_search?pretty |
3.4 Nested类型(删除)
- 序号为1的评论原来有三条,现在删除John的评论数据,删除后评论数为2条。
1 | POST article_new/_doc/1/_update |
3.5 Nested类型(改)
- 将steve评论内容中的age值调整为25,同时调整了评论内容。
1 | POST article_new/_doc/1/_update |
3.6 Nested类型(聚合)
- 认知前提:nested聚合隶属于聚合分类中的Bucket聚合分类。
- 聚合article_new 中评论者年龄最小的值。
1 | GET article_new/_search |
04.Nested类型的适用场景
__END__