全部产品
Search
文档中心

表格存储:统计聚合

更新时间:Jul 26, 2023

使用统计聚合功能可以实现求最小值、求最大值、求和、求平均值、统计行数、去重统计行数、按字段值分组、按范围分组、按地理位置分组、按过滤条件分组等操作;同时多个统计聚合功能可以组合使用,满足复杂的查询需求。

流程

统计聚合的完整执行流程如下图所示。

fig_agg_pro

统计聚合是在服务端的“查询”结束后执行,服务端会将“查询”阶段命中的所有文档根据查询请求进行统计聚合,因此统计聚合请求相比没有统计聚合的请求会复杂。

背景信息

统计聚合的详细功能请参见下表。

功能

说明

最小值

返回一个字段中的最小值,类似于SQL中的min。

最大值

返回一个字段中的最大值,类似于SQL中的max。

返回数值字段的总数,类似于SQL中的sum。

平均值

返回数值字段的平均值,类似于SQL中的avg。

统计行数

返回指定字段值的数量或者多元索引数据总行数,类似于SQL中的count。

去重统计行数

返回指定字段不同值的数量,类似于SQL中的count(distinct)。

百分位统计

百分位统计常用来统计一组数据的百分位分布情况,例如在日常系统运维中统计每次请求访问的耗时情况时,需要关注系统请求耗时的P25、P50、P90、P99值等分布情况。

TopRows

基于特定字段排序的TopRows统计。

字段值分组

根据一个字段的值对查询结果进行分组,相同的字段值放到同一分组内,返回每个分组的值和该值对应的个数。

说明

当分组较大时,按字段值分组可能会存在误差。

范围分组

根据一个字段的范围对查询结果进行分组,字段值在某范围内放到同一分组内,返回每个范围中相应的item个数。

地理位置分组

根据距离某一个中心点的范围对查询结果进行分组,距离差值在某范围内放到同一分组内,返回每个范围中相应的item个数。

过滤条件分组

按照过滤条件对查询结果进行分组,获取每个过滤条件匹配到的数量,返回结果的顺序和添加过滤条件的顺序一致。

直方图统计

按照指定数据间隔对查询结果进行分组,字段值在相同范围内放到同一分组内,返回每个分组的值和该值对应的个数。

嵌套

分组类型的统计聚合功能支持嵌套,其内部可以添加子统计聚合。

前提条件

  • 已初始化OTSClient。具体操作,请参见初始化
  • 已创建数据表并写入数据。
  • 已在数据表上创建多元索引。具体操作,请参见创建多元索引

最小值

返回一个字段中的最小值,类似于SQL中的min。

  • 参数

    参数

    说明

    name

    自定义的统计聚合名称,用于区分不同的统计聚合,可根据此名称获取本次统计聚合结果。

    field_name

    用于统计聚合的字段,仅支持Long、Double和Date类型。

    missing

    当某行数据中的字段为空时,字段值的默认值。

    • 如果未设置missing值,则在统计聚合时会忽略该行。

    • 如果设置了missing值,则使用missing值作为字段值的默认值参与统计聚合。

  • 示例

    $request = array(
        'table_name' => 'myTableName',
        'index_name' => 'myIndexName',
        'search_query' => array(
            'offset' => 0,
            'limit' => 0,
            'get_total_count' => true,
            'query' => array(
                'query_type' => QueryTypeConst::MATCH_ALL_QUERY
            ),
            'aggs' => array(
                'aggs' => array(
                    array(
                        'name' => 'agg_min',
                        'type' => AggregationTypeConst::AGG_MIN,
                        'body' => array(
                            'field_name' => 'long',
                            'missing' => 0
                        )
                    ),
                ),
            )
        ),
        'columns_to_get' => array(
            'return_type' => ColumnReturnTypeConst::RETURN_ALL_FROM_INDEX,
        ),
    );
    
    $response = $this->otsClient->search($request);
    $agg_results = $response["aggs"]["agg_results"];
    
    print json_encode($agg_results, JSON_PRETTY_PRINT);

最大值

返回一个字段中的最大值,类似于SQL中的max。

  • 参数

    参数

    说明

    name

    自定义的统计聚合名称,用于区分不同的统计聚合,可根据此名称获取本次统计聚合结果。

    field_name

    用于统计聚合的字段,仅支持Long、Double和Date类型。

    missing

    当某行数据中的字段为空时,字段值的默认值。

    • 如果未设置missing值,则在统计聚合时会忽略该行。

    • 如果设置了missing值,则使用missing值作为字段值的默认值参与统计聚合。

  • 示例

    $request = array(
        'table_name' => 'myTableName',
        'index_name' => 'myIndexName',
        'search_query' => array(
            'offset' => 0,
            'limit' => 0,
            'get_total_count' => true,
            'query' => array(
                'query_type' => QueryTypeConst::MATCH_ALL_QUERY
            ),
            'aggs' => array(
                'aggs' => array(
                    array(
                        'name' => 'agg_max',
                        'type' => AggregationTypeConst::AGG_MAX,
                        'body' => array(
                            'field_name' => 'long',
                            'missing' => 0
                        )
                    ),
                ),
            )
        ),
        'columns_to_get' => array(
            'return_type' => ColumnReturnTypeConst::RETURN_ALL_FROM_INDEX,
        ),
    );
    
    $response = $this->otsClient->search($request);
    $agg_results = $response["aggs"]["agg_results"];
    
    print json_encode($agg_results, JSON_PRETTY_PRINT);

返回数值字段的总数,类似于SQL中的sum。

  • 参数

    参数

    说明

    name

    自定义的统计聚合名称,用于区分不同的统计聚合,可根据此名称获取本次统计聚合结果。

    field_name

    用于统计聚合的字段,仅支持Long和Double类型。

    missing

    当某行数据中的字段为空时,字段值的默认值。

    • 如果未设置missing值,则在统计聚合时会忽略该行。

    • 如果设置了missing值,则使用missing值作为字段值的默认值参与统计聚合。

  • 示例

    $request = array(
        'table_name' => 'myTableName',
        'index_name' => 'myIndexName',
        'search_query' => array(
            'offset' => 0,
            'limit' => 0,
            'get_total_count' => true,
            'query' => array(
                'query_type' => QueryTypeConst::MATCH_ALL_QUERY
            ),
            'aggs' => array(
                'aggs' => array(
                    array(
                        'name' => 'agg_sum',
                        'type' => AggregationTypeConst::AGG_SUM,
                        'body' => array(
                            'field_name' => 'long',
                            'missing' => 0
                        )
                    ),
                ),
            )
        ),
        'columns_to_get' => array(
            'return_type' => ColumnReturnTypeConst::RETURN_ALL_FROM_INDEX,
        ),
    );
    
    $response = $this->otsClient->search($request);
    $agg_results = $response["aggs"]["agg_results"];
    
    print json_encode($agg_results, JSON_PRETTY_PRINT);

平均值

返回数值字段的平均值,类似于SQL中的avg。

  • 参数

    参数

    说明

    name

    自定义的统计聚合名称,用于区分不同的统计聚合,可根据此名称获取本次统计聚合结果。

    field_name

    用于统计聚合的字段,仅支持Long、Double和Date类型。

    missing

    当某行数据中的字段为空时,字段值的默认值。

    • 如果未设置missing值,则在统计聚合时会忽略该行。

    • 如果设置了missing值,则使用missing值作为字段值的默认值参与统计聚合。

  • 示例

    $request = array(
        'table_name' => 'myTableName',
        'index_name' => 'myIndexName',
        'search_query' => array(
            'offset' => 0,
            'limit' => 0,
            'get_total_count' => true,
            'query' => array(
                'query_type' => QueryTypeConst::MATCH_ALL_QUERY
            ),
            'aggs' => array(
                'aggs' => array(
                    array(
                        'name' => 'agg_avg',
                        'type' => AggregationTypeConst::AGG_AVG,
                        'body' => array(
                            'field_name' => 'long',
                            'missing' => 0
                        )
                    ),
                ),
            )
        ),
        'columns_to_get' => array(
            'return_type' => ColumnReturnTypeConst::RETURN_ALL_FROM_INDEX,
        ),
    );
    
    $response = $this->otsClient->search($request);
    $agg_results = $response["aggs"]["agg_results"];
    
    print json_encode($agg_results, JSON_PRETTY_PRINT);

统计行数

返回指定字段值的数量或者多元索引数据总行数,类似于SQL中的count。

说明

通过如下方式可以统计多元索引数据总行数或者某个query匹配的行数。

  • 使用统计聚合的count功能,在请求中设置count(*)。

  • 使用query功能的匹配行数,在query中设置setGetTotalCount(true);如果需要统计多元索引数据总行数,则使用MatchAllQuery。

如果需要获取多元索引数据某列出现的次数,则使用count(列名),可应用于稀疏列的场景。

  • 参数

    参数

    说明

    name

    自定义的统计聚合名称,用于区分不同的统计聚合,可根据此名称获取本次统计聚合结果。

    field_name

    用于统计聚合的字段,仅支持Long、Double、Boolean、Keyword、Geo_point和Date类型。

  • 示例

    $request = array(
        'table_name' => 'myTableName',
        'index_name' => 'myIndexName',
        'search_query' => array(
            'offset' => 0,
            'limit' => 0,
            'get_total_count' => true,
            'query' => array(
                'query_type' => QueryTypeConst::MATCH_ALL_QUERY
            ),
            'aggs' => array(
                'aggs' => array(
                    array(
                        'name' => 'agg_count',
                        'type' => AggregationTypeConst::AGG_COUNT,
                        'body' => array(
                            'field_name' => 'long',
                            'missing' => 0
                        )
                    ),
                ),
            )
        ),
        'columns_to_get' => array(
            'return_type' => ColumnReturnTypeConst::RETURN_ALL_FROM_INDEX,
        ),
    );
    
    $response = $this->otsClient->search($request);
    $agg_results = $response["aggs"]["agg_results"];
    
    print json_encode($agg_results, JSON_PRETTY_PRINT);

去重统计行数

返回指定字段不同值的数量,类似于SQL中的count(distinct)。

说明

去重统计行数的计算结果是个近似值。

  • 当去重统计行数小于1万时,计算结果接近精确值。

  • 当去重统计行数达到1亿时,计算结果的误差为2%左右。

  • 参数

    参数

    说明

    name

    自定义的统计聚合名称,用于区分不同的统计聚合,可根据此名称获取本次统计聚合结果。

    field_name

    用于统计聚合的字段,仅支持Long、Double、Boolean、Keyword、Geo_point和Date类型。

    missing

    当某行数据中的字段为空时,字段值的默认值。

    • 如果未设置missing值,则在统计聚合时会忽略该行。

    • 如果设置了missing值,则使用missing值作为字段值的默认值参与统计聚合。

  • 示例

    $request = array(
        'table_name' => 'myTableName',
        'index_name' => 'myIndexName',
        'search_query' => array(
            'offset' => 0,
            'limit' => 0,
            'get_total_count' => true,
            'query' => array(
                'query_type' => QueryTypeConst::MATCH_ALL_QUERY
            ),
            'aggs' => array(
                'aggs' => array(
                    array(
                        'name' => 'agg_distinct_count',
                        'type' => AggregationTypeConst::AGG_DISTINCT_COUNT,
                        'body' => array(
                            'field_name' => 'boolean',
                            'missing' => false
                        )
                    ),
                ),
            )
        ),
        'columns_to_get' => array(
            'return_type' => ColumnReturnTypeConst::RETURN_ALL_FROM_INDEX,
        ),
    );
    
    $response = $this->otsClient->search($request);
    $agg_results = $response["aggs"]["agg_results"];
    
    print json_encode($agg_results, JSON_PRETTY_PRINT);

百分位统计

百分位统计常用来统计一组数据的百分位分布情况,例如在日常系统运维中统计每次请求访问的耗时情况时,需要关注系统请求耗时的P25、P50、P90、P99值等分布情况。

说明

百分位统计为非精确统计,对不同百分位数值的计算精确度不同,较为极端的百分位数值更加准确,例如1%或99%的百分位数值会比50%的百分位数值准确。

  • 参数

    参数

    说明

    name

    自定义的统计聚合名称,用于区分不同的统计聚合,可根据此名称获取本次统计聚合结果。

    field_name

    用于统计聚合的字段,仅支持Long、Double和Date类型。

    percentiles

    百分位分布例如50、90、99,可根据需要设置一个或者多个百分位。

    missing

    当某行数据中的字段为空时,字段值的默认值。

    • 如果未设置missing值,则在统计聚合时会忽略该行。

    • 如果设置了missing值,则使用missing值作为字段值的默认值参与统计聚合。

  • 示例

    $request = array(
        'table_name' => 'myTableName',
        'index_name' => 'myIndexName',
        'search_query' => array(
            'offset' => 0,
            'limit' => 0,
            'get_total_count' => true,
            'query' => array(
                'query_type' => QueryTypeConst::MATCH_ALL_QUERY
            ),
            'aggs' => array(
                'aggs' => array(
                    array(
                        'name' => 'agg_percentiles',
                        'type' => AggregationTypeConst::AGG_PERCENTILES,
                        'body' => array(
                            'field_name' => 'long',
                            'percentiles' => array(60, 80, 100),
                            'missing' => 0
                        )
                    ),
                ),
            )
        ),
        'columns_to_get' => array(
            'return_type' => ColumnReturnTypeConst::RETURN_ALL_FROM_INDEX,
        ),
    );
    
    $response = $this->otsClient->search($request);
    $agg_results = $response["aggs"]["agg_results"];
    
    print json_encode($agg_results, JSON_PRETTY_PRINT);

TopRows

基于特定字段排序的TopRows统计。

通过GroupBy功能对查询结果进行分组后,获取每个分组内的一些行数据,可实现和MySQL中ANY_VALUE(field)类似的功能。

  • 参数

    参数

    说明

    name

    自定义的统计聚合名称,用于区分不同的统计聚合,可根据此名称获取本次统计聚合结果。

    limit

    Top N的个数。

    sort

    行排序规则,基于该排序下返回的TopRows。

    columns_to_get

    指定返回的字段,仅支持多元索引中的字段,且不支持数组、Date、Geopoint和Nested类型的字段。

    该参数复用request中的columns_to_get参数,在request中指定columns_to_get即可。

    说明

    获取统计聚合分组中的行时,如果多元索引中包含嵌套类型、地理位置类型或者数组类型的字段,则返回结果中只会包含主键信息,请手动反查数据表获取所需字段。

  • 示例

    $request = array(
        'table_name' => 'myTableName',
        'index_name' => 'myIndexName',
        'search_query' => array(
            'offset' => 0,
            'limit' => 0,
            'get_total_count' => true,
            'query' => array(
                'query_type' => QueryTypeConst::MATCH_ALL_QUERY
            ),
              'aggs' => array(
            'aggs' => array(
                    array(
                        'name' => 'avg_top_rows',
                        'type' => AggregationTypeConst::AGG_TOP_ROWS,
                        'body' => array(
                            'limit' => 2,
                            'sort' => array(
                                'sorters' => array(
                                    array(
                                        'field_sort' => array(
                                            'field_name' => 'long',
                                            'order' => SortOrderConst::SORT_ORDER_DESC
                                        )
                                    )
                                )
                            )
                        )
                    ),
                ),
            )
        ),
        'columns_to_get' => array(
            'return_type' => ColumnReturnTypeConst::RETURN_ALL_FROM_INDEX,
        ),
    );
    
    $response = $this->otsClient->search($request);
    $agg_results = $response["aggs"]["agg_results"];
    
    print json_encode($agg_results, JSON_PRETTY_PRINT);

字段值分组

根据一个字段的值对查询结果进行分组,相同的字段值放到同一分组内,返回每个分组的值和该值对应的个数。

说明

当分组较大时,按字段值分组可能会存在误差。

  • 参数

    参数

    说明

    name

    自定义的统计聚合名称,用于区分不同的统计聚合,可根据此名称获取本次统计聚合结果。

    field_name

    用于统计聚合的字段,仅支持Long、Double、Boolean、Keyword和Date类型。

    sort

    分组中的item排序规则,默认按照分组中item的数量降序排序,多个排序则按照添加的顺序进行排列。支持的参数如下。

    • 按照值的字典序升序排列

    • 按照值的字典序降序排列

    • 按照行数升序排列

    • 按照行数降序排列

    • 按照子统计聚合结果中值升序排列

    • 按照子统计聚合结果中值降序排列

    size

    返回的分组数量,默认值为10。最大值为2000。当分组数量超过2000时,只会返回前2000个分组。

    sub_aggs和sub_group_bys

    子统计聚合,子统计聚合会根据分组内容再进行一次统计聚合分析。

    • 场景

      统计每个类别的商品数量,且统计每个类别价格的最大值和最小值。

    • 方法

      最外层的统计聚合是根据类别进行分组,再添加两个子统计聚合求价格的最大值和最小值。

    • 结果示例

      • 水果:5个(其中价格的最大值为15,最小值为3)

      • 洗漱用品:10个(其中价格的最大值为98,最小值为1)

      • 电子设备:3个(其中价格的最大值为8699,最小值为2300)

      • 其它:15个(其中价格的最大值为1000,最小值为80)

  • 示例

    $request = array(
        'table_name' => 'myTableName',
        'index_name' => 'myIndexName',
        'search_query' => array(
            'offset' => 0,
            'limit' => 0,
            'get_total_count' => true,
            'query' => array(
                'query_type' => QueryTypeConst::MATCH_ALL_QUERY
            ),
            'group_bys' => array(
                'group_bys' => array(
                    array(
                        'name' => 'group_by_GROUP_BY_FIELD',
                        'type' => GroupByTypeConst::GROUP_BY_FIELD,
                        'body' => array(
                            'field_name' => 'boolean',
                            'size' => 3,
                            'min_doc_count' => 0,
                            'sort' => array(
                                'sorters' => array(
                                    array(
                                        'group_key_sort' => array(
                                            'order' => SortOrderConst::SORT_ORDER_DESC
                                        ),
                                    ),
                                )
                            ),
                        )
                    ),
                ),
            )
        ),
        'columns_to_get' => array(
            'return_type' => ColumnReturnTypeConst::RETURN_ALL_FROM_INDEX,
        ),
    );
    
    $response = $this->otsClient->search($request);
    $group_by_results = $response["group_bys"]["group_by_results"];
    
    print json_encode($group_by_results, JSON_PRETTY_PRINT);

范围分组

根据一个字段的范围对查询结果进行分组,字段值在某范围内放到同一分组内,返回每个范围中相应的item个数。

  • 参数

    参数

    说明

    name

    自定义的统计聚合名称,用于区分不同的统计聚合,可根据此名称获取本次统计聚合结果。

    field_name

    用于统计聚合的字段,仅支持Long和Double类型。

    ranges[from, to)

    分组的范围。

    起始值from可以使用最小值Double.MIN_VALUE,结束值to可以使用最大值Double.MAX_VALUE。

    sub_aggs和sub_group_bys

    子统计聚合,子统计聚合会根据分组内容再进行一次统计聚合分析。

    例如按销量分组后再按省份分组,即可获得某个销量范围内哪个省比重比较大,实现方法是GroupByRange下添加一个GroupByField。

  • 示例

    $request = array(
        'table_name' => 'myTableName',
        'index_name' => 'myIndexName',
        'search_query' => array(
            'offset' => 0,
            'limit' => 0,
            'get_total_count' => true,
            'query' => array(
                'query_type' => QueryTypeConst::MATCH_ALL_QUERY
            ),
            'group_bys' => array(
                'group_bys' => array(
                    array(
                        'name' => 'group_by_GROUP_BY_RANGE',
                        'type' => GroupByTypeConst::GROUP_BY_RANGE,
                        'body' => array(
                            'field_name' => 'long',
                            'ranges' => array(
                                array(
                                    'from' => 1,
                                    'to' => 3
                                ),
                                array(
                                    'from' => 3,
                                    'to' => 6
                                ),
                                array(
                                    'from' => 6,
                                    'to' => 10
                                )
                            )
                        )
                    ),
                ),
            )
        ),
        'columns_to_get' => array(
            'return_type' => ColumnReturnTypeConst::RETURN_ALL_FROM_INDEX,
        ),
    );
    
    $response = $this->otsClient->search($request);
    $group_by_results = $response["group_bys"]["group_by_results"];
    
    print json_encode($group_by_results, JSON_PRETTY_PRINT);

地理位置分组

根据距离某一个中心点的范围对查询结果进行分组,距离差值在某范围内放到同一分组内,返回每个范围中相应的item个数。

  • 参数

    参数

    说明

    name

    自定义的统计聚合名称,用于区分不同的统计聚合,可根据此名称获取本次统计聚合结果。

    field_name

    用于统计聚合的字段,仅支持Geo_point类型。

    origin(lat, lon)

    起始中心点的经纬度。

    lat是起始中心点纬度,lon是起始中心点经度。

    ranges[from, to)

    分组的范围,单位为米,from和to的值均为Double类型。

    起始值from可以使用最小值Double.MIN_VALUE,结束值to可以使用最大值Double.MAX_VALUE。

    sub_aggs和sub_group_bys

    子统计聚合,子统计聚合会根据分组内容再进行一次统计聚合分析。

  • 示例

    $request = array(
        'table_name' => 'myTableName',
        'index_name' => 'myIndexName',
        'search_query' => array(
            'offset' => 0,
            'limit' => 0,
            'get_total_count' => true,
            'query' => array(
                'query_type' => QueryTypeConst::MATCH_ALL_QUERY
            ),
            'group_bys' => array(
                'group_bys' => array(
                    array(
                        'name' => 'group_by_GROUP_BY_GEO_DISTANCE',
                        'type' => GroupByTypeConst::GROUP_BY_GEO_DISTANCE,
                        'body' => array(
                            'field_name' => 'geo',
                            'origin' => array(
                                'lat' => 5,
                                'lon' => 6
                            ),
                            'ranges' => array(
                                array(
                                    'from' => 0.,
                                    'to' => 1000.
                                ),
                                array(
                                    'from' => 10000.,
                                    'to' => 100000.
                                ),
                                array(
                                    'from' => 100000.,
                                ),
                            )
                        )
                    ),
                ),
            )
        ),
        'columns_to_get' => array(
            'return_type' => ColumnReturnTypeConst::RETURN_ALL_FROM_INDEX,
        ),
    );
    
    $response = $this->otsClient->search($request);
    $group_by_results = $response["group_bys"]["group_by_results"];
    
    print json_encode($group_by_results, JSON_PRETTY_PRINT);

过滤条件分组

按照过滤条件对查询结果进行分组,获取每个过滤条件匹配到的数量,返回结果的顺序和添加过滤条件的顺序一致。

  • 参数

    参数

    说明

    name

    自定义的统计聚合名称,用于区分不同的统计聚合,可根据此名称获取本次统计聚合结果。

    filters

    过滤条件,返回结果的顺序和添加过滤条件的顺序一致。

    sub_aggs和sub_group_bys

    子统计聚合,子统计聚合会根据分组内容再进行一次统计聚合分析。

  • 示例

    $request = array(
        'table_name' => 'myTableName',
        'index_name' => 'myIndexName',
        'search_query' => array(
            'offset' => 0,
            'limit' => 0,
            'get_total_count' => true,
            'query' => array(
                'query_type' => QueryTypeConst::MATCH_ALL_QUERY
            ),
            'group_bys' => array(
                'group_bys' => array(
                    array(
                        'name' => 'group_by_GROUP_BY_FILTER',
                        'type' => GroupByTypeConst::GROUP_BY_FILTER,
                        'body' => array(
                            'filters' => array(
                                array(
                                    'query_type' => QueryTypeConst::TERM_QUERY,
                                    'query' => array(
                                        'field_name' => 'boolean',
                                        'term' => false
                                    )
                                ),
                                array(
                                    'query_type' => QueryTypeConst::TERM_QUERY,
                                    'query' => array(
                                        'field_name' => 'boolean',
                                        'term' => true
                                    )
                                )
                            )
                        )
                    ),
                ),
            )
        ),
        'columns_to_get' => array(
            'return_type' => ColumnReturnTypeConst::RETURN_ALL_FROM_INDEX,
        ),
    );
    
    $response = $this->otsClient->search($request);
    $group_by_results = $response["group_bys"]["group_by_results"];
    
    print json_encode($group_by_results, JSON_PRETTY_PRINT);

直方图统计

按照指定数据间隔对查询结果进行分组,字段值在相同范围内放到同一分组内,返回每个分组的值和该值对应的个数。

  • 参数

    参数

    说明

    name

    自定义的统计聚合名称,用于区分不同的统计聚合,可根据此名称获取本次统计聚合结果。

    field_name

    用于统计聚合的字段,仅支持Long和Double类型。

    interval

    统计间隔。

    field_range[min,max]

    统计范围,与interval参数配合使用限制分组的数量。(field_range.max-field_range.min)/interval的值不能超过2000。

    min_doc_count

    最小行数。当分组中的行数小于最小行数时,不会返回此分组的统计结果。

    missing

    当某行数据中的字段为空时,字段值的默认值。

    • 如果未设置missing值,则在统计聚合时会忽略该行。

    • 如果设置了missing值,则使用missing值作为字段值的默认值参与统计聚合。

  • 示例

    $request = array(
        'table_name' => 'myTableName',
        'index_name' => 'myIndexName',
        'search_query' => array(
            'offset' => 0,
            'limit' => 0,
            'get_total_count' => true,
            'query' => array(
                'query_type' => QueryTypeConst::MATCH_ALL_QUERY
            ),
            'group_bys' => array(
                'group_bys' => array(
                    array(
                        'name' => 'group_by_GROUP_BY_HISTOGRAM',
                        'type' => GroupByTypeConst::GROUP_BY_HISTOGRAM,
                        'body' => array(
                            'field_name' => 'long',
                            'interval' => 3,
                            'missing' => 0,
                            'min_doc_count' => 0,
                            'field_range' => array(
                                'min' => 2,
                                'max' => 10,
                            ),
                            'sort' => array(
                                'sorters' => array(
                                    array(
                                        'row_count_sort' => array(
                                            'order' => SortOrderConst::SORT_ORDER_ASC
                                        )
                                    )
                                )
                            )
                        )
                    ),
                ),
            )
        ),
        'columns_to_get' => array(
            'return_type' => ColumnReturnTypeConst::RETURN_ALL_FROM_INDEX,
        ),
    );
    
    $response = $this->otsClient->search($request);
    $group_by_results = $response["group_bys"]["group_by_results"];
    
    print json_encode($group_by_results, JSON_PRETTY_PRINT);

嵌套

分组类型的统计聚合功能支持嵌套,其内部可以添加子统计聚合。

主要用于在分组内再次进行统计聚合,以两层的嵌套为例:

  • GroupBy+SubGroupBy:按省份分组后再按照城市分组,获取每个省份下每个城市的数据。

  • GroupBy+SubAggregation:按照省份分组后再求某个指标的最大值,获取每个省的某个指标最大值。

说明

为了性能、复杂度等综合考虑,嵌套的层级只开放了一定的层数。更多信息,请参见多元索引限制

$request = array(
    'table_name' => 'myTableName',
    'index_name' => 'myIndexName',
    'search_query' => array(
        'offset' => 0,
        'limit' => 0,
        'get_total_count' => true,
        'query' => array(
            'query_type' => QueryTypeConst::MATCH_ALL_QUERY
        ),
        'group_bys' => array(
            'group_bys' => array(
                array(
                    'name' => 'group_by_GROUP_BY_FIELD',
                    'type' => GroupByTypeConst::GROUP_BY_FIELD,
                    'body' => array(
                        'field_name' => 'boolean',
                        'size' => 3,
                        'min_doc_count' => 0,
                        'sort' => array(
                            'sorters' => array(
                                array(
                                    'group_key_sort' => array(
                                        'order' => SortOrderConst::SORT_ORDER_DESC
                                    ),
                                ),
                            )
                        ),
                        'sub_aggs' => array(
                            'aggs' => array(
                                array(
                                    'name' => 'groupSum',
                                    'type' => AggregationTypeConst::AGG_SUM,
                                    'body' => array(
                                        'field_name' => 'long',
                                        'missing' => 0
                                    )
                                ),
                            ),
                        ),
                    )
                ),
            ),
        )
    ),
    'columns_to_get' => array(
        'return_type' => ColumnReturnTypeConst::RETURN_ALL_FROM_INDEX,
    ),
);

$response = $this->otsClient->search($request);
$group_by_results = $response["group_bys"]["group_by_results"];

print json_encode($group_by_results, JSON_PRETTY_PRINT);