ES-针对某个字段去重后-获取某个字段值的所有值

针对上面表的数据,现在想根据age分组,并获取每个分组后的name有哪些(去重后)。

复制代码
select age, GROUP_CONCAT(DISTINCT(name)) from testtable group by age ;

结果:

如果想要增加排序:

复制代码
SELECT 
    age, 
    GROUP_CONCAT(DISTINCT name) AS names,
    COUNT(DISTINCT name) AS name_count
FROM 
    testtable 
GROUP BY 
    age
ORDER BY 
    name_count DESC;

结果:

使用ES实现类似上面的SQL效果:

复制代码
SearchRequest searchRequest = new SearchRequest("indexName");
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder().size(0);
        BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();
       
        //时间范围
         RangeQueryBuilder pubtimeBuilder = QueryBuilders.rangeQuery("pubtime").gte(stime).lte(etime);
            boolQueryBuilder.must(pubtimeBuilder);
     
        searchSourceBuilder.query(boolQueryBuilder);

        // 添加 cardinality 聚合 
           AggregationBuilder  cardinalityAggregationBuilder = AggregationBuilders
                    .cardinality("unique_organ_id")
                    .field("organ_id");

              // 添加 terms 聚合以获取去重后的具体数据
           AggregationBuilder  termsAggregationBuilder = AggregationBuilders
                    .terms("distinct_ids")
                    .field("organ_id")
                    .size(10000);//根据实际的确定

        searchSourceBuilder.aggregation(cardinalityAggregationBuilder);
        searchSourceBuilder.aggregation(termsAggregationBuilder);
        searchRequest.source(searchSourceBuilder);

        try {
            SearchResponse searchResponse = elasticsearchClient.search(searchRequest, RequestOptions.DEFAULT);
            ParsedCardinality uniqueMcnOrganIdAgg = searchResponse.getAggregations().get("unique_organ_id");
            total = uniqueMcnOrganIdAgg.getValue();
            if(total > 0){
                Terms terms = searchResponse.getAggregations().get("distinct_ids");
                for (Terms.Bucket bucket : terms.getBuckets()) {
                    String mcnOrganId = bucket.getKeyAsString();
                    ids.add(mcnOrganId);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        Result result = new Result();
        result.setIds(ids);
        result.setTotal(total);
        return result;
相关推荐
老华带你飞10 分钟前
房屋租赁管理系统|基于java+ vue房屋租赁管理系统(源码+数据库+文档)
java·开发语言·前端·数据库·vue.js·spring boot·后端
AC赳赳老秦29 分钟前
财务数据智能解读:DeepSeek分析利润表生成异常波动原因报告
数据库·人工智能·postgresql·zookeeper·测试用例·时序数据库·deepseek
Li_7695321 小时前
Redis进阶(二)—— Redis 事务
数据库·redis·缓存
少云清1 小时前
【接口测试】2_PyMySQL模块 _数据库操作步骤及事务
数据库·pymysql·代码实现
AI题库1 小时前
PostgreSQL 18 从新手到大师:实战指南 - 1.3 Docker环境搭建
数据库·docker·postgresql
少云清1 小时前
【接口测试】3_PyMySQL模块 _连接数据库
数据库·pymysql·代码实现
lkbhua莱克瓦241 小时前
基础-SQL-DML
开发语言·数据库·笔记·sql·mysql
herinspace2 小时前
管家婆网店ERP如何录入成本调价单
服务器·数据库·oracle·智能手机·电脑
短剑重铸之日2 小时前
7天读懂MySQL|Day 1: MySQL 架构全景
数据库·mysql·架构
醉风塘2 小时前
MongoDB高级查询全攻略:使用MongoTemplate实现分组、排序、分页与连表查询
数据库·mongodb