希望长大对我而言,是可以做更多想做的事,而不是被迫做更多不想做的事...... 首页 Elasticsearch之nested object 丁D 学无止境 2019-09-30 09:43 37534已阅读 Elasticsearch nested 摘要本文将讲解Elasticsearch的nested object类型 ```js 假设我们有这么一篇文章,并且存有两个评论 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类型深入详解](https://mp.weixin.qq.com/s/Bvpv00ywVwtXPy7VVGdzXg) 很赞哦! (1) 上一篇:Elasticsearch搜索特性 下一篇:利用accesslog统计QPS 目录 点击排行 redis哨兵 Elasticsearch6.3.2之x-pack 2019-09-24 11:12 Redis+Twemproxy+HAProxy+Keepalived 2019-07-12 17:20 JVM垃圾回收器 2019-10-10 10:23 GC优化策略和相关实践案例 2019-10-10 10:54 标签云 Java Spring MVC Mybatis Ansible Elasticsearch Redis Hive Docker Kubernetes RocketMQ Jenkins Nginx 友情链接 郑晓博客 佛布朗斯基 凉风有信 MarkHoo's Blog 冰洛博客 南实博客 Rui | 丁D Java研发工程师 生活可以用「没办法」三个字概括。但别人的没办法是「腿长,没办法」、「长得好看,没办法」、「有才华,没办法」。而你的没办法,是真的没办法。 请作者喝咖啡