elasticsearch:使用top_hits聚合获取分组列表
文章目录
- 业务需求
- 实现
- java代码
- kibana请求体
- 返回示例
业务需求
- 需要获取分组列表,查询返回值不是一个列表,而是根据某个字段分组
- 每组返回前5条,不足5条,则返回全部
- 按照时间倒序
实现
- elasticsearch提供了
top_hits
聚合函数,支持返回前几条 TermsAggregationBuilder
和TopHitsAggregationBuilder
2个聚合函数结合使用,实现该效果
java代码
- 具体代码如下:
@Overridepublic Map<String, Object> aggregateTopHitsByField(PolicyContentQuerySynVO queryVO) {Map<String, Object> result = new HashedMap();SearchRequestBuilder builder = elasticsearchTemplate.getClient().prepareSearch(POLICY_INDEX_NAME).setTypes(POLICY_TYPE_NAME);//根据查询条件PolicyContentQuerySynVO,构造SearchConditionSearchCondition searchCondition = searchCondition(queryVO);//查询条件builder.setQuery(searchCondition.getQueryBuilder());builder.setFetchSource(false);TermsAggregationBuilder aggregation = AggregationBuilders.terms(queryVO.getAggregateKey()+"_arr").field(queryVO.getAggregateKey());if(queryVO.getAggregateOrder() != null){aggregation.order(Terms.Order.count(queryVO.getAggregateOrder()));}if(null != queryVO.getAggregateSize()){aggregation.size(queryVO.getAggregateSize());}else {aggregation.size(2000);}// topHits 返回分组列表TopHitsAggregationBuilder topHitsAggregationBuilder = AggregationBuilders.topHits(queryVO.getAggregateKey());if(null != queryVO.getAggregateTopHitSize()){topHitsAggregationBuilder.size(queryVO.getAggregateTopHitSize());}else {topHitsAggregationBuilder.size(10);}// 增加排序String sortField = queryVO.getSortField();if(Ls.isEmpty(sortField)){sortField = SORT_FIELD;}if("desc".equals(queryVO.getSortOrder())){topHitsAggregationBuilder.sort(sortField, SortOrder.DESC);}else {topHitsAggregationBuilder.sort(sortField, SortOrder.ASC);}aggregation.subAggregation(topHitsAggregationBuilder);builder = builder.addAggregation(aggregation).setSize(0);logger.info("aggregateTopHitsByField:: builder:\n{}",builder);SearchResponse response = builder.get();if(response != null){String bucketKey = queryVO.getAggregateKey()+"_arr";Terms terms = response.getAggregations().get(bucketKey);Map<String,Long> countMap = new LinkedHashMap();Map<String,List<Object>> infoMap = new LinkedHashMap();for (Terms.Bucket entry1 : terms.getBuckets()) {String key = entry1.getKey().toString(); // bucket keyLong docCount = entry1.getDocCount(); // Doc countcountMap.put(key,docCount);TopHits topHits = entry1.getAggregations().get("level");List<Object> topResult = new ArrayList<>();for(SearchHit hit : topHits.getHits()){Map<String, Object> resultMap = new HashedMap();for (Map.Entry<String, Object> entry : hit.getSource().entrySet()) {if(entry.getValue() == null){continue;}resultMap.put(entry.getKey(),String.valueOf(entry.getValue()));}topResult.add(resultMap);}infoMap.put(key,topResult);}result.put(bucketKey + "_count",countMap);result.put(bucketKey + "_info",infoMap);}return result;}
kibana请求体
- 也可以使用
kibana
等工具测试,或者直接curl
测试
GET /policylibrary/info/_search
{"size": 0,"query": {"bool": {"must": [{"term": {"isPublish": {"value": 1,"boost": 1}}},{"term": {"topicIds.keyword": {"value": 100041,"boost": 1}}}],"disable_coord": false,"adjust_pure_negative": true,"boost": 1}},"_source": false,"aggregations": {"level_arr": {"terms": {"field": "level","size": 2000,"min_doc_count": 1,"shard_min_doc_count": 0,"show_term_doc_count_error": false,"order": [{"_count": "desc"},{"_term": "asc"}]},"aggregations": {"level": {"top_hits": {"from": 0,"size": 6,"version": false,"explain": false,"sort": [{"publishDate": {"order": "desc"}}],"_source" : {"includes" : [],"excludes" : ["content"]}}}}}}
}
返回示例
- 返回结果为:
{"took": 1,"timed_out": false,"_shards": {"total": 3,"successful": 3,"failed": 0},"hits": {"total": 4,"max_score": 0,"hits": []},"aggregations": {"level_arr": {"doc_count_error_upper_bound": 0,"sum_other_doc_count": 0,"buckets": [{"key": 2,"doc_count": 2,"level": {"hits": {"total": 2,"max_score": null,"hits": [{"_index": "policylibrary","_type": "info","_id": "100000911","_score": null,"_source": {"publishDate": "2021-05-27 19:16:13","title": "安徽省人民政府办公厅关于推进社会保障卡建设的通知","url": "http://192.168.1.73:7381/site/tpl/5021?id=100000911"},"sort": [1622142973000]},{"_index": "policylibrary","_type": "info","_id": "100000651","_score": null,"_source": {"publishDate": "2021-03-15 15:15:25","title": "安徽省人民政府办公厅关于印发支持凹凸棒基新材料产业发展若干政策的通知","url": "http://192.168.1.73:7381/site/tpl/5021?id=100000651"},"sort": [1615821325000]}]}}},{"key": 1,"doc_count": 1,"level": {"hits": {"total": 1,"max_score": null,"hits": [{"_index": "policylibrary","_type": "info","_id": "100000901","_score": null,"_source": {"publishDate": "2021-05-27 19:11:35","title": "人力资源和社会保障部关于印发“中华人民共和国社会保障卡”管理办法的通知","url": "http://192.168.x.xx:7381/site/tpl/5021?id=100000901"},"sort": [1622142695000]}]}}},{"key": 3,"doc_count": 1,"level": {"hits": {"total": 1,"max_score": null,"hits": [{"_index": "policylibrary","_type": "info","_id": "100000931","_score": null,"_source": {"publishDate": "2021-07-05 15:31:25","title": "建党100周年","url": "http://192.168.x.xx:7381/site/tpl/5021?id=100000931"},"sort": [1625499085000]}]}}}]}}
}
elasticsearch:使用top_hits聚合获取分组列表相关推荐
- elasticsearch(7)聚合统计-分组聚合
原文:https://blog.csdn.net/sz85850597/article/details/82858831 elasticsearch(7)聚合统计-分组聚合 2018年09月26日 2 ...
- 获取分组后取某字段最大一条记录(求每个类别中最大的值的列表)
获取分组后取某字段最大一条记录 方法一:(效率最高) select * from test as a where typeindex = (select max(b.typeindex) from t ...
- 七.全文检索ElasticSearch经典入门-聚合查询
前言 今天我们讲ES的高亮和聚合查询,聚合功能是ES很重要的功能,它基于查询条件来对数据进行分桶和计算.它提供了类似于关系型数据库的SUM,COUNT, AVG , Group By 等功能.聚合也可 ...
- 利用python进行数据分析——使用groupby机制对pandas对象类的数据进行聚合与分组操作
文章目录 数据聚合与分组操作 一.GroupBy机制 1.1遍历各分组 1.2选取一列或所有列的子集 1.3 通过字典或Series进行分组 1.4 通过函数进行分组 1.5根据索引层级分组 二. 数 ...
- 类的应用python平均分_【数据科学系统学习】Python # 数据分析基本操作[四] 数据规整化和数据聚合与分组运算...
本篇内容为整理<利用Python进行数据分析>,博主使用代码为 Python3,部分内容和书本有出入. 在前几篇中我们介绍了 NumPy.pandas.matplotlib 三个库的基本操 ...
- django 中的聚合和分组 F查询 Q查询 事务cookies和sessions 066
django 中的聚合和分组 F查询 Q查询 事务cookies和sessions 066 1 聚合和分组 聚合:对一些数据进行整理分析 进而得到结果(mysql中的聚合函数) 1aggregate( ...
- 【Android 仿微信通讯录 导航分组列表-下】自定义View为RecyclerView打造右侧索引导航栏IndexBar
本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布 转载请标明出处: http://blog.csdn.net/zxt0601/article/details/52420706 本文出 ...
- pandas合并groupby_pandas数据聚合与分组运算——groupby方法
简介 pandas中一类非常重要的操作是数据聚合与分组运算.通过groupby方法能够实现对数据集的拆分.统计.转换等操作,这个过程一气呵成. 在本文中,你将学到: 选取特定列分组: 对分组进行迭代: ...
- es 去重统计_es 去重查询(聚合、分组、分页、求和统计等)
elasticsearch(es) 如何针对指定字段进行去重相关查询,完成如聚合.分组.分页.类似求和统计等操作? 获取所有的不同值 es 获取指定字段所有可能的值,可以使用桶聚合的 terms 聚合 ...
最新文章
- 选点(dfs序+LIS)
- C语言ATD1SC,2020-10-13_ATD(模数转换)模块介绍
- 【笔记】An explainable deep machine vision framework for plant stress phenotyping
- HBase与时空索引技术
- Spark RDD在Spark中的地位和作用如何?
- 下一个更大元素 I(LeetCode 496)
- Ubuntu安装pycharm并且激活
- Application.Goto 方法
- Python——正则表达式特殊符号及用法
- 安卓第二阶段实训项目:基于媒体库音乐播放器V1.0
- new Vue 发生了什么?
- 6.6 AdaBoost实战
- 【C/C++】内存基础
- 微博黄v怎么认证?怎么满足条件详解 身份认证|兴趣认证|视频认证
- android 微信朋友圈相册封面裁剪的小秘密
- 显示器尺寸 和 屏幕分辨率 和 有源信号分辨率 关系
- java tld文件配置_如何在JavaWeb程序中使用tld文件
- 【编程题】【Scratch二级】2020.06 小鸡捉害虫​
- 达梦数据库(DM8)的安装教程
- 树形结构最优化问题:后根遍历