数据库字段

在之前介绍Elasticsearch字段的时候介绍过Elasticsearch的嵌套字段。在日常使用中,针对嵌套类型的聚合操作和普通字段类型有些许的不同。

嵌套类型

  • nested

是ES对对象数组设置的类型,它可以对对象数组进行索引。

我们插入一个这样的数据。

{"group" : "fans","user" : [ {"first" : "John","last" :  "Smith"},{"first" : "Alice","last" :  "White"}]
}

最后可以得到一个类似这样的结果

{"group" :        "fans","user.first" : [ "alice", "john" ],"user.last" :  [ "smith", "white" ]
}

数据模拟

我们现在有一个索引test_field2里面存在这样结构的数据

    {"name": "内容1","desc": "描述1","channel": [{"name": "one","num": 28},{"name": "two","num": 32}]}

获取嵌套数据的和

按照普通字段的格式去查询

按照之前学习的内容依照普通的字段聚合分析的样子我们尝试使用下面的参数来进行求和,但是显然对于嵌套数据是不行的

{"aggs": {"aggQuery": {"sum": {"field": "channel.num"}}},"size": 0
}

使用上面的参数并没有返回数据。

{"took": 5,"timed_out": false,"_shards": {"total": 1,"successful": 1,"skipped": 0,"failed": 0},"hits": {"total": {"value": 1,"relation": "eq"},"max_score": null,"hits": []},"aggregations": {"aggQuery": {"value": 0}}
}

nested方法

为了方便我们对字段中的嵌套类型进行操作Elasticsearch提供了nested方法让我们对嵌套字段实现操作。

使用nested需要指定嵌套字段的路径path,假如希望对嵌套字段内的内容进行聚合等操作的时候需要指明字段的全部路径。channel.num

{"query": {"match_all": {"boost": 1.0}},"aggregations": {"test": {"nested": {"path": "channel"},"aggregations": {"sumChannel": {"sum": {"field": "channel.num"}}}}}
}

此时我们对嵌套内数据的求和操作,并不是仅仅将一条数据内此字段的数据进行聚合,而是将所有数据中嵌套内的值求和。下面的返回内容中test桶中的sumChannel的结果就是将两条数据的四个num值进行了相加操作。

{"took": 133,"timed_out": false,"_shards": {"total": 1,"successful": 1,"skipped": 0,"failed": 0},"hits": {"total": {"value": 2,"relation": "eq"},"max_score": 1,"hits": [{"_index": "test_field2","_type": "_doc","_id": "1","_score": 1,"_source": {"name": "内容1","desc": "描述1","channel": [{"name": "one","num": 28},{"name": "two","num": 32}]}},{"_index": "test_field2","_type": "_doc","_id": "2","_score": 1,"_source": {"name": "内容1","desc": "描述1","channel": [{"name": "one","num": 33},{"name": "two","num": 44}]}}]},"aggregations": {"test": {"doc_count": 4,"sumChannel": {"value": 137}}}
}

上面操作对应Java的代码

针对嵌套字段JAVA中主要使用NestedAggregationBuilder来进行操作

    public static void queryIndex() throws IOException {NestedAggregationBuilder nested = AggregationBuilders.nested("test", "channel");nested.subAggregation(AggregationBuilders.sum("sumChannel").field("channel.num"));// match all query 查询所有数据SearchRequest searchRequest = new SearchRequest();SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();searchSourceBuilder.query(QueryBuilders.matchAllQuery());searchSourceBuilder.aggregation(nested);searchRequest.source(searchSourceBuilder);// 同步执行 RestClientUtils.client 获得ES连接的方法SearchResponse searchResponse = RestClientUtils.client.search(searchRequest, RequestOptions.DEFAULT);Aggregations aggregations = searchResponse.getAggregations();}

获取嵌套数据不为空的数量

在对某一个字段存在值的数据总数求值的时候,我们只需要count对应的字段既能求出结果。但是对于嵌套字段,假如想当然的使用之前的做法。并不会返回预期的结果。

尝试使用count嵌套字段获取数量

{"aggs": {"aggQuery": {"value_count": {"field": "channel"}}},"size": 0
}
{"took": 1,"timed_out": false,"_shards": {"total": 1,"successful": 1,"skipped": 0,"failed": 0},"hits": {"total": {"value": 2,"relation": "eq"},"max_score": null,"hits": []},"aggregations": {"aggQuery": {"value": 0}}
}

然而实际上并不能获得正确的结果。即使是一个简单的求值是否存在对于嵌套字段依然要使用

{"size":0,"query": {"match_all": {"boost": 1.0}},"aggregations": {"test": {"nested": {"path": "channel"},"aggregations": {"sumChannel": {"value_count": {"field": "channel.num"}}}}}
}

需要注意的是我们尝试对嵌套字段某个字段进行count的时候,返回的内容是所有数据在嵌套字段中存在的数量。像下面结果,虽然我们只有两条数据但是存在四条子数据,所以count结果为4。可能有的时候我们希望查出嵌套字段存在值的父级数据的数量,使用这种方法显然不合适。

{"took": 2,"timed_out": false,"_shards": {"total": 1,"successful": 1,"skipped": 0,"failed": 0},"hits": {"total": {"value": 2,"relation": "eq"},"max_score": null,"hits": []},"aggregations": {"test": {"doc_count": 4,"sumChannel": {"value": 4}}}
}

如何仅仅是想获取存在嵌套值的数据的数量,可以使用下面的方法

首先使用mustnested筛选出符合条件的数据,然后通过获取其hits命中的数量或者自行使用其他字段进行count求值。

{"size": 0,"query": {"bool": {"must": [{"nested": {"path": "channel","query": {"bool": {"must": [{"exists": {"field": "channel.num"}}]}}}}]}},"aggs": {"aggQuery": {"value_count": {"field": "name"}}}
}
{"took": 2,"timed_out": false,"_shards": {"total": 1,"successful": 1,"skipped": 0,"failed": 0},"hits": {"total": {"value": 2,"relation": "eq"},"max_score": null,"hits": []},"aggregations": {"aggQuery": {"value": 2}}
}

个人水平有限,上面的内容可能存在没有描述清楚或者错误的地方,假如开发同学发现了,请及时告知,我会第一时间修改相关内容。假如我的这篇内容对你有任何帮助的话,麻烦给我点一个赞。你的点赞就是我前进的动力。

Elasticsearch嵌套字段的聚合操作相关推荐

  1. elasticsearch多字段聚合实现方式

    文章目录 1.背景 2.实现多字段聚合的思路 3.需求 4.数据准备 4.1 创建索引 4.2 准备数据 5.实现方式 5.1 multi_terms实现 5.1.1 dsl 5.1.2 java 代 ...

  2. python 数据分析(六)astype('category')按类别分组 + 分组聚合操作 + 透视表 + 交叉表 + excel表的数据处理

    文章目录 一.按照类别单独分类astype() 1. astype()用法 二.时间操作 1. 第一种:直接利用to_datetime() 2. 第二种:Series.dt 三.分组聚合操作 1. 分 ...

  3. elasticsearch聚合操作——本质就是针对搜索后的结果使用桶bucket(允许嵌套)进行group by,统计下分组结果,包括min/max/avg...

    分析 最后,我们还有一个需求需要完成:允许管理者在职员目录中进行一些分析. Elasticsearch有一个功能叫做聚合(aggregations),它允许你在数据上生成复杂的分析统计.它很像SQL中 ...

  4. java操作es聚合操作并显示其他字段_深入浅析Elasticsearch中的聚合操作

    如果写过Elasticsearch的聚合操作DSL,都知道它非常的繁琐,很简单的业务就导致异常复杂的json.因为它的聚合操作是嵌套的,一个聚合的输出可以是另一个聚合的输入,并且聚合还支持pipeli ...

  5. Elasticsearch(三)——Es搜索(简单使用、全文查询、复合查询)、地理位置查询、特殊查询、聚合操作、桶聚合、管道聚合

    Elasticsearch(三)--Es搜索(简单使用.全文查询.复合查询).地理位置查询.特殊查询.聚合操作.桶聚合.管道聚合 一.Es搜索 这里的 Es 数据博主自己上网找的,为了练习 Es 搜索 ...

  6. es对分组后结果进行统计_elasticsearch聚合操作——本质就是针对搜索后的结果使用桶bucket(允许嵌套)进行group by,统计下分组结果,包括min/max/avg...

    分析 最后,我们还有一个需求需要完成:允许管理者在职员目录中进行一些分析. Elasticsearch有一个功能叫做聚合(aggregations),它允许你在数据上生成复杂的分析统计.它很像SQL中 ...

  7. 在Elasticsearch中对 text 类型的字段进行聚合异常Fielddata is disabled,Set fielddata=true

    在Elasticsearch中对 text 类型的字段进行聚合异常Fielddata is disabled,Set fielddata=true 参考文章: (1)在Elasticsearch中对 ...

  8. Java调用ElasticSearch 7.2.1 保存、统计、多字段分组聚合

    目录 maven引用 配置 配置类 保存数据方法 参照官方的引用方式会报错 分组统计 查询后再统计 多字段分组聚合 maven引用 注意版本与es版本一致 <dependency>< ...

  9. 基于 MongoDB 动态字段设计的探索 (二) 聚合操作

    业务需求及设计见前文:基于 MongoDB 动态字段设计的探索 根据专业计算各科平均分 (总分.最高分.最低分) public Object avg(String major){Aggregation ...

最新文章

  1. tensorflow入门(二)
  2. oracle数据库导出灰色_oracle数据库导出和oracle导入数据的二种方法(oracle导入导出数据)...
  3. 开源重量级的流程引擎或UI引擎
  4. 旧 WCF 项目迁移到 asp.net core + gRPC 的尝试
  5. 搜索 —— 启发式搜索 —— 爬山法
  6. 计算机编程课程顺序_九月份可以开始提供650多种免费的在线编程和计算机科学课程
  7. socket编程简单Demo讲解及源码分享(C# Winform 内网)
  8. InstanceBeginEditable dw中特有标识
  9. jQuery Mobile中固定工具栏header、footer的data-*选项
  10. 【托业】【新托业TOEIC新题型真题】学习笔记11-题库六-P7
  11. Windows 和 Linux 的免费媒体播放器 - SMPlayer
  12. Hbase Locality
  13. 为什么upupoo显示服务器维护中,首先,电脑能正常上网,有的网站可以上传图片,但就是不能显示上传图片的功能按钮,网页打开都正常。...
  14. 阿里云实时大数据解决方案,助力企业实时分析与决策
  15. 线性时态逻辑ctl_基于决策过程的广义可能性时态逻辑模型检测
  16. 学会4种方法,掌握端到端测试处理数据..
  17. NHibernate基础
  18. Android退出APP 并杀掉相关的所有进程
  19. 思博伦仪表模拟DHCP动态地址获取
  20. 初学JavaWeb需要知道的目录结构与配置

热门文章

  1. iPad 8和iPadAir 3 的区别
  2. 小米9SE安卓9和MIUI10无法完全root
  3. 使用VirtualBox【四步】搭建Kubernetes集群(2023-02-13)
  4. 来自工作表单元格的Excel按钮文本
  5. ERP使用技巧:仓库分类管理五大误区
  6. 生物博士跨专业到计算机,我如何利用三个月跨专业考上名校博士
  7. 《豆美人》(散文一篇,与君共赏)
  8. java第七封印游戏_第七封印游戏攻略秘籍集锦
  9. WOW插件:ShortRobot 1.21 发布(2006.10.3)
  10. android关键词检索功能,Android实现搜索关键词高亮显示-Kotlin