关于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;
    }

返回的结果如图:

相关推荐
疯狂的Alex1 小时前
【C#避坑实战系列文章15】C# WinForm 上位机开发:解决串口粘包+LiveCharts卡顿+InfluxDB存储(免费代码+仿真工具)
sqlite·c#·上位机·串口通信·livechars·c#硬件对接
AI数据皮皮侠4 小时前
中国上市公司数据(2000-2023年)
大数据·人工智能·python·深度学习·机器学习
Elastic 中国社区官方博客8 小时前
Elasticsearch MCP 服务器:与你的 Index 聊天
大数据·服务器·人工智能·elasticsearch·搜索引擎·ai·全文检索
文火冰糖的硅基工坊11 小时前
[创业之路-653]:社会产品与服务的分类
大数据·数据库·人工智能
key0612 小时前
ISO 27001 信息安全管理体系 (ISMS) 建设与运营
大数据·安全合规
数据要素X14 小时前
【大数据实战】如何从0到1构建用户画像系统(案例+数据仓库+Airflow调度)
大数据·数据仓库·数据治理·数据中台
ajassi200014 小时前
开源 C# 快速开发(十六)数据库--sqlserver增删改查
windows·开源·c#
TDengine (老段)15 小时前
TDengine 时序函数 DERIVATIVE 用户手册
大数据·数据库·sql·物联网·时序数据库·iot·tdengine
TDengine (老段)15 小时前
TDengine 时序函数 STATEDURATION 用户手册
大数据·数据库·sql·物联网·时序数据库·iot·tdengine
凯子坚持 c15 小时前
2025年大模型服务性能深度解析:从清华评测报告看蓝耘元生代MaaS平台的综合实力
大数据·数据库·人工智能