前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Elasticsearch之nested object

Elasticsearch之nested object

作者头像
丁D
发布2022-08-12 21:02:27
2350
发布2022-08-12 21:02:27
举报
文章被收录于专栏:老铁丁D老铁丁D
代码语言:javascript
复制
假设我们有这么一篇文章,并且存有两个评论 
PUT 54288.top:9200/website/blogs/1 
{ 
"title": "花无缺发表的一篇帖子", 
"content": "我是花无缺,大家要不要考虑一下投资房产和买股票的事情啊。。。", 
"tags": [ "投资", "理财" ], 
"comments": [ 
{ 
"name": "小鱼儿", 
"comment": "什么股票啊?推荐一下呗", 
"age": 28, 
"stars": 4, 
"date": "2016-09-01" 
}, 
{ 
"name": "黄药师", 
"comment": "我喜欢投资房产,风,险大收益也大", 
"age": 31, 
"stars": 5, 
"date": "2016-10-22" 
} 
] 
} 
需求:我们需要查询28岁,黄药师评论过的文章(注意数据源黄药师是31岁,所以查询出来因为是null的) 
http://www.54288.top:9200/website/_search 
{ 
"query": { 
"bool": { 
"must": [ 
{ "match": { "comments.name": "黄药师" }}, 
{ "match": { "comments.age": 28 }} 
] 
} 
} 
} 
结果:有数据如下(错误???) 
{ 
"took": 6, 
"timed_out": false, 
"_shards": { 
"total": 5, 
"successful": 5, 
"skipped": 0, 
"failed": 0 
}, 
"hits": { 
"total": 1, 
"max_score": 1.8630463, 
"hits": [ 
{ 
"_index": "website", 
"_type": "blogs", 
"_id": "1", 
"_score": 1.8630463, 
"_source": { 
"title": "花无缺发表的一篇帖子", 
"content": "我是花无缺,大家要不要考虑一下投资房产和买股票的事情啊。。。", 
"tags": [ 
"投资", 
"理财" 
], 
"comments": [ 
{ 
"name": "小鱼儿", 
"comment": "什么股票啊?推荐一下呗", 
"age": 28, 
"stars": 4, 
"date": "2016-09-01" 
}, 
{ 
"name": "黄药师", 
"comment": "我喜欢投资房产,风,险大收益也大", 
"age": 31, 
"stars": 5, 
"date": "2016-10-22" 
} 
] 
} 
} 
] 
} 
} 
原因是,es会将一个json数组中的数据,进行扁平化 
object类型数据结构的底层存储 
{ 
"title": [ "花无缺", "发表", "一篇", "帖子" ], 
"content": [ "我", "是", "花无缺", "大家", "要不要", "考虑", "一下", "投资", "房产", "买", "股票", "事情" ], 
"tags": [ "投资", "理财" ], 
"comments.name": [ "小鱼儿", "黄药师" ], 
"comments.comment": [ "什么", "股票", "推荐", "我", "喜欢", "投资", "房产", "风险", "收益", "大" ], 
"comments.age": [ 28, 31 ], 
"comments.stars": [ 4, 5 ], 
"comments.date": [ 2016-09-01, 2016-10-22 ] 
} 
这样的话我们去查询就能查询出来了,当然是错误的 
处理方案 
nested object类型,来解决object类型底层数据结构导致的问题 
1.先删除index(因为index的mapping不能修改) 
DELETE 54288.top:9200/website/ 
2.建立mapping 
{ 
"mappings": { 
"blogs": { 
"properties": { 
"comments": { 
"type": "nested", 
"properties": { 
"name": { "type": "text" }, 
"comment": { "type": "text" }, 
"age": { "type": "short" }, 
"stars": { "type": "short" }, 
"date": { "type": "date" } 
} 
} 
} 
} 
} 
} 
3.将数据塞入es中 
4.查询数据,返回结果是null正确 
{ 
"query": { 
"bool": { 
"must": [ 
{ "match": { "comments.name": "黄药师" }}, 
{ "match": { "comments.age": 28 }} 
] 
} 
} 
} 
结果 
{ 
"took": 9, 
"timed_out": false, 
"_shards": { 
"total": 5, 
"successful": 5, 
"skipped": 0, 
"failed": 0 
}, 
"hits": { 
"total": 0, 
"max_score": null, 
"hits": [] 
} 
} 
原理 
{ 
{ 
"comments.name": [ "小鱼儿" ], 
"comments.comment": [ "什么", "股票", "推荐" ], 
"comments.age": [ 28 ], 
"comments.stars": [ 4 ], 
"comments.date": [ 2014-09-01 ] 
} 
{ 
"comments.name": [ "黄药师" ], 
"comments.comment": [ "我", "喜欢", "投资", "房产", "风险", "收益", "大" ], 
"comments.age": [ 31 ], 
"comments.stars": [ 5 ], 
"comments.date": [ 2014-10-22 ] 
} 
{ 
"title": [ "花无缺", "发表", "一篇", "帖子" ], 
"body": [ "我", "是", "花无缺", "大家", "要不要", "考虑", "一下", "投资", "房产", "买", "股票", "事情" ], 
"tags": [ "投资", "理财" ] 
} 
} 

注意:子文档最多10000条!!!!

Elasticsearch Nested类型深入详解

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-09-30 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

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

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

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