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

类型

  • 最小值
    • 定义:返回一个字段中的最小值,类似于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)。
      • 参数说明
        参数 说明
        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());
}