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

返回的结果如图:

相关推荐
AI_56782 小时前
AWS EC2新手入门:6步带你从零启动实例
大数据·数据库·人工智能·机器学习·aws
CRzkHbaXTmHw2 小时前
探索Flyback反激式开关电源的Matlab Simulink仿真之旅
大数据
七夜zippoe3 小时前
CANN Runtime任务描述序列化与持久化源码深度解码
大数据·运维·服务器·cann
懒人咖3 小时前
缺料分析时携带用料清单的二开字段
c#·金蝶云星空
盟接之桥3 小时前
盟接之桥说制造:引流品 × 利润品,全球电商平台高效产品组合策略(供讨论)
大数据·linux·服务器·网络·人工智能·制造
忆~遂愿3 小时前
ops-cv 算子库深度解析:面向视觉任务的硬件优化与数据布局(NCHW/NHWC)策略
java·大数据·linux·人工智能
bugcome_com3 小时前
深入了解 C# 编程环境及其开发工具
c#
忆~遂愿4 小时前
GE 引擎与算子版本控制:确保前向兼容性与图重写策略的稳定性
大数据·开发语言·docker
米羊1214 小时前
已有安全措施确认(上)
大数据·网络
人道领域5 小时前
AI抢人大战:谁在收割你的红包
大数据·人工智能·算法