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

返回的结果如图:

相关推荐
茗鹤APS和MES2 小时前
APS高级计划排程:汽车零部件厂生产排产的智慧之选
大数据·制造·精益生产制造·aps高级排程系统
清风与日月2 小时前
c# 集成激光雷达(以思岚A1为例)
开发语言·c#
蒙特卡洛的随机游走2 小时前
Spark的persist和cache
大数据·分布式·spark
蒙特卡洛的随机游走2 小时前
Spark 中 distribute by、sort by、cluster by 深度解析
大数据·分布式·spark
梦里不知身是客112 小时前
Spark中的宽窄依赖-宽窄巷子
大数据·分布式·spark
化作星辰2 小时前
java 给鉴权kafka2.7(sasl)发送消息权限异常处理
java·大数据·开发语言·kafka
无极小卒2 小时前
如何在三维空间中生成任意方向的矩形内部点位坐标
开发语言·算法·c#
user_admin_god3 小时前
企业级管理系统的站内信怎么轻量级优雅实现
java·大数据·数据库·spring boot
mengml_smile3 小时前
大数据生态Sql引擎
大数据
the白勺4 小时前
RabbitMQ-基础-总结
开发语言·c#