关于easy-es的聚合问题-已解决

es实体类:

java 复制代码
public class ChemicalES {

    @IndexId(type = IdType.CUSTOMIZE)
    private Long id;
    @HighLight
    @IndexField(fieldType = FieldType.TEXT,  analyzer = "ik_max_word")
    private String name;
    @IndexField(fieldType = FieldType.KEYWORD)
    private List<String> productTags;
}

存入es中的查询结构:

现在希望对字段 productTags 进行聚合,想要聚合后结构如下:

bash 复制代码
[
{key:'化肥',value:2},
{key:'农药',value:1},
{key:'尿素',value:2},
]

请教如何操作呢? 我用easy-es的api进行聚合一直报错。

解决方案:

因为这种方式叫做嵌套聚合,所以无法使用easy-es相关api,easy-es的groupBy只适合 key_word类型的 非数组属性的字段,而数组属性的字段 需要利用restHighLevelClient。

以下是通用代码示例:

java 复制代码
    @Autowired
    public RestHighLevelClient restHighLevelClient;


    /**
     * [描述]
     * @param indexName  索引名
     * @param multiMatchQuery 多字段查询条件
     * 示例: MultiMatchQueryBuilder multiMatchQuery = QueryBuilders.multiMatchQuery("测试", "title");
     * @param fieldName  数组字段名
     * @param fieldNameAs  聚合以后的数组字段别名
     *
     */
    private List<Map<Object,Object>> commonGroup( String indexName, MultiMatchQueryBuilder multiMatchQuery,
                           String fieldName,String fieldNameAs
                           ) throws IOException {
        SearchRequest request = new SearchRequest();
        // 查询索引为nba的数据
        request.indices(indexName);

        // 对color字段进行分组
        SearchSourceBuilder builder = new SearchSourceBuilder();
        // 如果只关心分组数据,将结果集设置为0,即不展示hits中的数据
        builder.size(0);
        // 设置分组名称为`colorGroup`,并且结果数量进行排序,false:表示desc,true表示asc
        AggregationBuilder aggregationBuilder = AggregationBuilders.terms(fieldNameAs)
                .field(fieldName).order(BucketOrder.count(false));
        builder.aggregation(aggregationBuilder);
        if(multiMatchQuery != null){
            builder.query(multiMatchQuery);
        }
        // 执行查询
        request.source(builder);
        SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT);
        // 获取数据
        Aggregations aggregations = response.getAggregations();
        ParsedStringTerms colorGroup = aggregations.get(fieldNameAs);
        List<? extends Terms.Bucket> buckets = colorGroup.getBuckets();
        List<Map<Object,Object>> result = new ArrayList<>();
        for (Terms.Bucket bucket : buckets) {
            Map<Object,Object> map =new HashMap<>(2);
            System.out.println("name:" + bucket.getKey() + "," + "count:" + bucket.getDocCount());
            map.put("name",bucket.getKey());
            map.put("count",bucket.getDocCount());
            result.add(map);
        }
        return result;
    }

返回的结果如图:

相关推荐
Yolo566Q3 分钟前
基于Python语言快速批量运行DSSAT模型及交叉融合、扩展应用技术应用
大数据·人工智能
KuAI_KST5 分钟前
2026 抖音私信 AI 客服实战手册:快商通 AI 与人工回复转化对比实测
大数据·人工智能·机器学习
A_QXBlms7 分钟前
企微私域工具SOP自动化实战:3条核心流程配置教程
大数据·自动化·企业微信
NOCSAH14 分钟前
体验统好AI租赁管理:业务闭环与智能数据决策
大数据·人工智能·统好ai
Gofarlic_OMS33 分钟前
SolidEdge专业许可证管理工具选型关键评估标准
java·大数据·运维·服务器·人工智能
顧棟1 小时前
HDFS2.X升级3.X案例与相关Issue
大数据·hadoop·hdfs
武藤一雄1 小时前
C# 异步回调与等待机制
前端·microsoft·设计模式·微软·c#·.netcore
NOCSAH2 小时前
统好AI SRM模块:智能采购管理实战解析
大数据·人工智能·统好ai·数智一体化平台
黎阳之光3 小时前
数智技术如何赋能空天地一体化,领跑低空经济新赛道
大数据·人工智能·算法·安全·数字孪生
运维行者_3 小时前
使用 Applications Manager 实现 AWS 云监控:保障业务应用高效运行
大数据·运维·服务器·网络·数据库·云计算·aws