本文主要为您介绍多元索引的统计接口。

最小值

  • 定义:返回一个字段中的最小值,类似于SQL中的min。如字段值不存在则不包括在计算中。可设置默认值。
  • 参数说明:
    参数 说明
    aggregationName 用户给本次统计聚合功能自定义的名字,用于区分不同的统计聚合操作。在使用结果时,需要根据该名字找到本次统计聚合的结果。
    fieldName 统计操作作用的字段,仅支持long、double类型。
    missing 默认值。如果某一行数据中该字段为空,如没有设置missing则在统计时会忽略该行,如设置了missing则该行使用missing值参与最小值的统计。
  • Java示例
    /**
     *  商品库里有每一个商品的价格,求产地为浙江省的商品中价格最低的商品价格是多少。
     *  等效的SQL是:SELECT min(column_price) FROM product where place_of_production="浙江省";
     */
    public void min(SyncClient client) {
        // 构建查询语句
        SearchRequest searchRequest = SearchRequest.newBuilder()
            .tableName("tableName")
            .indexName("indexName")
            .searchQuery(
                SearchQuery.newBuilder()
                    .query(QueryBuilders.term("place_of_production","浙江省"))
                    .limit(0)   // 如果只关心统计聚合的结果,返回匹配到的结果数量设置为0有助于提高响应速度。
                    .addAggregation(AggregationBuilders.min("min_agg_1", "column_price").missing(100))
                    .build())
            .build();
        //执行查询
        SearchResponse resp = client.search(searchRequest);
        //获取统计聚合的结果
        System.out.println(resp.getAggregationResults().getAsMinAggregationResult("min_agg_1").getValue());
    }

最大值

  • 定义:返回一个字段中的最大值,类似于SQL中的max。如字段值不存在则不包括在计算中。可设置默认值。
  • 参数说明
    参数 说明
    aggregationName 用户给本次统计聚合功能自定义的名字,用于区分不同的统计聚合操作。在使用结果时,需要根据该名字找到本次统计聚合的结果。
    fieldName 统计操作作用的字段,仅支持long、double类型。
    missing 默认值。如果某一行数据中该字段为空,没有设置missing则在统计时会忽略该行,设置了missing则该行使用missing值参与最大值的统计。
  • Java示例
    /**
     * 商品库里有每一个商品的价格,求产地为浙江省的商品中,价格最高的商品价格是多少?
     * 等效的SQL是:SELECT max(column_price) FROM product where place_of_production="浙江省";
     */
    public void max(SyncClient client) {
        // 构建查询语句
        SearchRequest searchRequest = SearchRequest.newBuilder()
            .tableName("tableName")
            .indexName("indexName")
            .searchQuery(
                SearchQuery.newBuilder()
                    .query(QueryBuilders.term("place_of_production", "浙江省"))
                    .limit(0)   // 如果只关心统计聚合的结果,返回匹配到的结果数量设置为0有助于提高响应速度。
                    .addAggregation(AggregationBuilders.max("max_agg_1", "column_price").missing(0))
                    .build())
            .build();
        //执行查询
        SearchResponse resp = client.search(searchRequest);
        //获取统计聚合的结果
        System.out.println(resp.getAggregationResults().getAsMaxAggregationResult("max_agg_1").getValue());
    }

  • 定义:返回数值字段的总数,类似于SQL中的sum。如字段值不存在则不包括在计算中。可设置默认值。
  • 参数说明
    参数 说明
    aggregationName 用户给本次统计聚合功能自定义的名字,用于区分不同的统计聚合操作。在使用结果时,需要根据该名字找到本次统计聚合的结果。
    fieldName 统计操作作用的字段,仅支持long、double类型。
    missing 默认值。如果某一行数据中该字段为空,如没有设置missing则在统计时会忽略该行,如设置了missing则该行使用missing值参与求和。
  • Java示例
    /**
     * 商品库里有每一个商品的售出数量,求产地为浙江省的商品中,一共售出了多少件商品?如果某一件商品没有该值,默认售出了10件。
     * 等效的SQL是:SELECT sum(column_price) FROM product where place_of_production="浙江省";
     */
    public void sum(SyncClient client) {
        // 构建查询语句
        SearchRequest searchRequest = SearchRequest.newBuilder()
            .tableName("tableName")
            .indexName("indexName")
            .searchQuery(
                SearchQuery.newBuilder()
                    .query(QueryBuilders.term("place_of_production", "浙江省"))
                    .limit(0)   // 如果只关心统计聚合的结果,返回匹配到的结果数量设置为0有助于提高响应速度。
                    .addAggregation(AggregationBuilders.sum("sum_agg_1", "column_number").missing(10))
                    .build())
            .build();
        //执行查询
        SearchResponse resp = client.search(searchRequest);
        //获取统计聚合的结果
        System.out.println(resp.getAggregationResults().getAsSumAggregationResult("sum_agg_1").getValue());
    }

平均值

  • 定义:返回数值字段的平均值,类似于SQL中的avg。如字段值不存在则不包括在计算中。可设置默认值。
  • 参数说明
    参数 说明
    aggregationName 用户给本次统计聚合功能自定义的名字,用于区分不同的统计聚合操作。在使用结果时,需要根据该名字找到本次统计聚合的结果。
    fieldName 统计操作作用的字段,仅支持long、double类型。
    missing 默认值。如果某一行数据中该字段为空,如没有设置missing则在统计时会忽略该行,如设置了missing则该行使用missing值参与求平均值。
  • Java示例
    /**
     * 商品库里有每一个商品的售出数量,求产地为浙江省的商品中,平均价格是多少?
     *  等效的SQL是:SELECT avg(column_price) FROM product where place_of_production="浙江省";
     */
    public void avg(SyncClient client) {
        // 构建查询语句
        SearchRequest searchRequest = SearchRequest.newBuilder()
            .tableName("tableName")
            .indexName("indexName")
            .searchQuery(
                SearchQuery.newBuilder()
                    .query(QueryBuilders.term("place_of_production", "浙江省"))
                    .limit(0)   // 如果只关心统计聚合的结果,返回匹配到的结果数量设置为0有助于提高响应速度。
                    .addAggregation(AggregationBuilders.avg("avg_agg_1", "column_number"))
                    .build())
            .build();
        //执行查询
        SearchResponse resp = client.search(searchRequest);
        //获取统计聚合的结果
        System.out.println(resp.getAggregationResults().getAsAvgAggregationResult("avg_agg_1").getValue());
    }

文档个数

  • 定义:返回指定字段的值的数目,类似于SQL中的count。如一行数据中没有该字段则不参与文档计数。
    说明 当前count接口不支持count(*),如果要统计全索引的行数或者某个query匹配的行数,请使用query接口,且在query中设置setGetTotalCount(true)即可。
  • 参数说明
    参数 说明
    aggregationName 用户给本次统计聚合功能自定义的名字,用于区分不同的统计聚合操作。在使用结果时,需要根据该名字找到本次统计聚合的结果。
    fieldName 统计操作作用的字段。文档个数的统计仅支持long、double、boolean、keyword、geo_point类型。
  • Java示例
    /**
     * 商家库里有每一个商家的惩罚记录,求浙江省的商家中,有惩罚记录的一共有多少个商家?(假设没有惩罚记录的商家信息中不存在该字段)
     * 等效的SQL是:SELECT count(column_history) FROM product where place_of_production="浙江省";
     */
    public void count(SyncClient client) {
        // 构建查询语句
        SearchRequest searchRequest = SearchRequest.newBuilder()
            .tableName("tableName")
            .indexName("indexName")
            .searchQuery(
                SearchQuery.newBuilder()
                    .query(QueryBuilders.term("place", "浙江省"))
                    .limit(0)
                    .addAggregation(AggregationBuilders.count("count_agg_1", "column_history"))
                    .build())
            .build();
        //执行查询
        SearchResponse resp = client.search(searchRequest);
        //获取统计聚合的结果
        System.out.println(resp.getAggregationResults().getAsCountAggregationResult("count_agg_1").getValue());
    }

去重文档个数

  • 定义:返回指定字段的不同值的数目,类似于SQL中的 count(distinct)。可设置字段的默认值(missing)。
    说明 去重文档个数的计算结果是个大约值。当去重文档个数小于1万时,计算结果几乎是一个精确值;当去重文档个数达到1亿时,计算结果误差为2%左右。
  • 参数说明
    参数 说明
    aggregationName 用户给本次统计聚合功能自定义的名字,用于区分不同的统计聚合操作。在使用结果时,需要根据该名字找到本次统计聚合的结果。
    fieldName 统计操作作用的字段。仅支持long、double、boolean、keyword、geo_point类型。
    missing 默认值。如果某一行数据中该字段为空,如没有设置missing则在统计时会忽略该行,如设置了missing则该行使用missing值参与计算去重文档个数。
  • Java示例
    /**
     * 求所有的商品,产地一共来自多少个省?
     * 等效的SQL是:SELECT count(distinct column_place) FROM product;
     */
    public void distinctCount(SyncClient client) {
        // 构建查询语句
        SearchRequest searchRequest = SearchRequest.newBuilder()
            .tableName("tableName")
            .indexName("indexName")
            .searchQuery(
                SearchQuery.newBuilder()
                    .query(QueryBuilders.matchAll())
                    .limit(0)
                    .addAggregation(AggregationBuilders.distinctCount("dis_count_agg_1", "column_place"))
                    .build())
            .build();
        //执行查询
        SearchResponse resp = client.search(searchRequest);
        //获取统计聚合的结果
        System.out.println(resp.getAggregationResults().getAsDistinctCountAggregationResult("dis_count_agg_1").getValue());
    }

多个统计

每次请求支持多个统计一起分析。

Java示例

public void multipleAggregation(SyncClient client) {
    // 构建查询语句
    SearchRequest searchRequest = SearchRequest.newBuilder()
        .tableName("tableName")
        .indexName("indexName")
        .searchQuery(
            SearchQuery.newBuilder()
                .query(QueryBuilders.matchAll())
                .limit(0)
                .addAggregation(AggregationBuilders.min("name1", "long"))
                .addAggregation(AggregationBuilders.sum("name2", "long"))
                .addAggregation(AggregationBuilders.distinctCount("name3", "long"))
                .build())
        .build();
    //执行查询
    SearchResponse resp = client.search(searchRequest);
    //获取第1个统计聚合的结果
    System.out.println(resp.getAggregationResults().getAsMinAggregationResult("name1").getValue());
    //获取第2个统计聚合的结果
    System.out.println(resp.getAggregationResults().getAsSumAggregationResult("name2").getValue());
    //获取第3个统计聚合的结果
    System.out.println(resp.getAggregationResults().getAsDistinctCountAggregationResult("name3").getValue());
}