統(tǒng)計聚合
使用統(tǒng)計聚合功能可以實現(xiàn)求最小值、求最大值、求和、求平均值、統(tǒng)計行數(shù)、去重統(tǒng)計行數(shù)、按字段值分組、按范圍分組、按地理位置分組、按過濾條件分組等操作;同時多個統(tǒng)計聚合功能可以組合使用,滿足復(fù)雜的查詢需求。
流程
統(tǒng)計聚合的完整執(zhí)行流程如下圖所示。
統(tǒng)計聚合是在服務(wù)端的“查詢”結(jié)束后執(zhí)行,服務(wù)端會將“查詢”階段命中的所有文檔根據(jù)查詢請求進行統(tǒng)計聚合,因此統(tǒng)計聚合請求相比沒有統(tǒng)計聚合的請求會復(fù)雜。
背景信息
統(tǒng)計聚合的詳細功能請參見下表。
功能 | 說明 |
最小值 | 返回一個字段中的最小值,類似于SQL中的min。 |
最大值 | 返回一個字段中的最大值,類似于SQL中的max。 |
和 | 返回數(shù)值字段的總數(shù),類似于SQL中的sum。 |
平均值 | 返回數(shù)值字段的平均值,類似于SQL中的avg。 |
統(tǒng)計行數(shù) | 返回指定字段值的數(shù)量或者多元索引數(shù)據(jù)總行數(shù),類似于SQL中的count。 |
去重統(tǒng)計行數(shù) | 返回指定字段不同值的數(shù)量,類似于SQL中的count(distinct)。 |
百分位統(tǒng)計 | 百分位統(tǒng)計常用來統(tǒng)計一組數(shù)據(jù)的百分位分布情況,例如在日常系統(tǒng)運維中統(tǒng)計每次請求訪問的耗時情況時,需要關(guān)注系統(tǒng)請求耗時的P25、P50、P90、P99值等分布情況。 |
TopRows | 基于特定字段排序的TopRows統(tǒng)計。 |
字段值分組 | 根據(jù)一個字段的值對查詢結(jié)果進行分組,相同的字段值放到同一分組內(nèi),返回每個分組的值和該值對應(yīng)的個數(shù)。 說明 當分組較大時,按字段值分組可能會存在誤差。 |
范圍分組 | 根據(jù)一個字段的范圍對查詢結(jié)果進行分組,字段值在某范圍內(nèi)放到同一分組內(nèi),返回每個范圍中相應(yīng)的item個數(shù)。 |
地理位置分組 | 根據(jù)距離某一個中心點的范圍對查詢結(jié)果進行分組,距離差值在某范圍內(nèi)放到同一分組內(nèi),返回每個范圍中相應(yīng)的item個數(shù)。 |
過濾條件分組 | 按照過濾條件對查詢結(jié)果進行分組,獲取每個過濾條件匹配到的數(shù)量,返回結(jié)果的順序和添加過濾條件的順序一致。 |
直方圖統(tǒng)計 | 按照指定數(shù)據(jù)間隔對查詢結(jié)果進行分組,字段值在相同范圍內(nèi)放到同一分組內(nèi),返回每個分組的值和該值對應(yīng)的個數(shù)。 |
嵌套 | 分組類型的統(tǒng)計聚合功能支持嵌套,其內(nèi)部可以添加子統(tǒng)計聚合。 |
前提條件
- 已初始化OTSClient。具體操作,請參見初始化。
- 已創(chuàng)建數(shù)據(jù)表并寫入數(shù)據(jù)。
- 已在數(shù)據(jù)表上創(chuàng)建多元索引。具體操作,請參見創(chuàng)建多元索引。
最小值
返回一個字段中的最小值,類似于SQL中的min。
參數(shù)
參數(shù)
說明
name
自定義的統(tǒng)計聚合名稱,用于區(qū)分不同的統(tǒng)計聚合,可根據(jù)此名稱獲取本次統(tǒng)計聚合結(jié)果。
field_name
用于統(tǒng)計聚合的字段,僅支持Long、Double和Date類型。
missing
當某行數(shù)據(jù)中的字段為空時,字段值的默認值。
如果未設(shè)置missing值,則在統(tǒng)計聚合時會忽略該行。
如果設(shè)置了missing值,則使用missing值作為字段值的默認值參與統(tǒng)計聚合。
示例
$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。
參數(shù)
參數(shù)
說明
name
自定義的統(tǒng)計聚合名稱,用于區(qū)分不同的統(tǒng)計聚合,可根據(jù)此名稱獲取本次統(tǒng)計聚合結(jié)果。
field_name
用于統(tǒng)計聚合的字段,僅支持Long、Double和Date類型。
missing
當某行數(shù)據(jù)中的字段為空時,字段值的默認值。
如果未設(shè)置missing值,則在統(tǒng)計聚合時會忽略該行。
如果設(shè)置了missing值,則使用missing值作為字段值的默認值參與統(tǒng)計聚合。
示例
$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);
和
返回數(shù)值字段的總數(shù),類似于SQL中的sum。
參數(shù)
參數(shù)
說明
name
自定義的統(tǒng)計聚合名稱,用于區(qū)分不同的統(tǒng)計聚合,可根據(jù)此名稱獲取本次統(tǒng)計聚合結(jié)果。
field_name
用于統(tǒng)計聚合的字段,僅支持Long和Double類型。
missing
當某行數(shù)據(jù)中的字段為空時,字段值的默認值。
如果未設(shè)置missing值,則在統(tǒng)計聚合時會忽略該行。
如果設(shè)置了missing值,則使用missing值作為字段值的默認值參與統(tǒng)計聚合。
示例
$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);
平均值
返回數(shù)值字段的平均值,類似于SQL中的avg。
參數(shù)
參數(shù)
說明
name
自定義的統(tǒng)計聚合名稱,用于區(qū)分不同的統(tǒng)計聚合,可根據(jù)此名稱獲取本次統(tǒng)計聚合結(jié)果。
field_name
用于統(tǒng)計聚合的字段,僅支持Long、Double和Date類型。
missing
當某行數(shù)據(jù)中的字段為空時,字段值的默認值。
如果未設(shè)置missing值,則在統(tǒng)計聚合時會忽略該行。
如果設(shè)置了missing值,則使用missing值作為字段值的默認值參與統(tǒng)計聚合。
示例
$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);
統(tǒng)計行數(shù)
返回指定字段值的數(shù)量或者多元索引數(shù)據(jù)總行數(shù),類似于SQL中的count。
通過如下方式可以統(tǒng)計多元索引數(shù)據(jù)總行數(shù)或者某個query匹配的行數(shù)。
使用統(tǒng)計聚合的count功能,在請求中設(shè)置count(*)。
使用query功能的匹配行數(shù),在query中設(shè)置setGetTotalCount(true);如果需要統(tǒng)計多元索引數(shù)據(jù)總行數(shù),則使用MatchAllQuery。
如果需要獲取多元索引數(shù)據(jù)某列出現(xiàn)的次數(shù),則使用count(列名),可應(yīng)用于稀疏列的場景。
參數(shù)
參數(shù)
說明
name
自定義的統(tǒng)計聚合名稱,用于區(qū)分不同的統(tǒng)計聚合,可根據(jù)此名稱獲取本次統(tǒng)計聚合結(jié)果。
field_name
用于統(tǒng)計聚合的字段,僅支持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);
去重統(tǒng)計行數(shù)
返回指定字段不同值的數(shù)量,類似于SQL中的count(distinct)。
去重統(tǒng)計行數(shù)的計算結(jié)果是個近似值。
當去重統(tǒng)計行數(shù)小于1萬時,計算結(jié)果接近精確值。
當去重統(tǒng)計行數(shù)達到1億時,計算結(jié)果的誤差為2%左右。
參數(shù)
參數(shù)
說明
name
自定義的統(tǒng)計聚合名稱,用于區(qū)分不同的統(tǒng)計聚合,可根據(jù)此名稱獲取本次統(tǒng)計聚合結(jié)果。
field_name
用于統(tǒng)計聚合的字段,僅支持Long、Double、Boolean、Keyword、Geo_point和Date類型。
missing
當某行數(shù)據(jù)中的字段為空時,字段值的默認值。
如果未設(shè)置missing值,則在統(tǒng)計聚合時會忽略該行。
如果設(shè)置了missing值,則使用missing值作為字段值的默認值參與統(tǒng)計聚合。
示例
$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);
百分位統(tǒng)計
百分位統(tǒng)計常用來統(tǒng)計一組數(shù)據(jù)的百分位分布情況,例如在日常系統(tǒng)運維中統(tǒng)計每次請求訪問的耗時情況時,需要關(guān)注系統(tǒng)請求耗時的P25、P50、P90、P99值等分布情況。
百分位統(tǒng)計為非精確統(tǒng)計,對不同百分位數(shù)值的計算精確度不同,較為極端的百分位數(shù)值更加準確,例如1%或99%的百分位數(shù)值會比50%的百分位數(shù)值準確。
參數(shù)
參數(shù)
說明
name
自定義的統(tǒng)計聚合名稱,用于區(qū)分不同的統(tǒng)計聚合,可根據(jù)此名稱獲取本次統(tǒng)計聚合結(jié)果。
field_name
用于統(tǒng)計聚合的字段,僅支持Long、Double和Date類型。
percentiles
百分位分布例如50、90、99,可根據(jù)需要設(shè)置一個或者多個百分位。
missing
當某行數(shù)據(jù)中的字段為空時,字段值的默認值。
如果未設(shè)置missing值,則在統(tǒng)計聚合時會忽略該行。
如果設(shè)置了missing值,則使用missing值作為字段值的默認值參與統(tǒng)計聚合。
示例
$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統(tǒng)計。
通過GroupBy功能對查詢結(jié)果進行分組后,獲取每個分組內(nèi)的一些行數(shù)據(jù),可實現(xiàn)和MySQL中ANY_VALUE(field)
類似的功能。
參數(shù)
參數(shù)
說明
name
自定義的統(tǒng)計聚合名稱,用于區(qū)分不同的統(tǒng)計聚合,可根據(jù)此名稱獲取本次統(tǒng)計聚合結(jié)果。
limit
Top N的個數(shù)。
sort
行排序規(guī)則,基于該排序下返回的TopRows。
columns_to_get
指定返回的字段,僅支持多元索引中的字段,且不支持數(shù)組、Date、Geopoint和Nested類型的字段。
該參數(shù)復(fù)用request中的columns_to_get參數(shù),在request中指定columns_to_get即可。
說明獲取統(tǒng)計聚合分組中的行時,如果多元索引中包含嵌套類型、地理位置類型或者數(shù)組類型的字段,則返回結(jié)果中只會包含主鍵信息,請手動反查數(shù)據(jù)表獲取所需字段。
示例
$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);
字段值分組
根據(jù)一個字段的值對查詢結(jié)果進行分組,相同的字段值放到同一分組內(nèi),返回每個分組的值和該值對應(yīng)的個數(shù)。
當分組較大時,按字段值分組可能會存在誤差。
參數(shù)
參數(shù)
說明
name
自定義的統(tǒng)計聚合名稱,用于區(qū)分不同的統(tǒng)計聚合,可根據(jù)此名稱獲取本次統(tǒng)計聚合結(jié)果。
field_name
用于統(tǒng)計聚合的字段,僅支持Long、Double、Boolean、Keyword和Date類型。
sort
分組中的item排序規(guī)則,默認按照分組中item的數(shù)量降序排序,多個排序則按照添加的順序進行排列。支持的參數(shù)如下。
按照值的字典序升序排列
按照值的字典序降序排列
按照行數(shù)升序排列
按照行數(shù)降序排列
按照子統(tǒng)計聚合結(jié)果中值升序排列
按照子統(tǒng)計聚合結(jié)果中值降序排列
size
返回的分組數(shù)量,默認值為10。最大值為2000。當分組數(shù)量超過2000時,只會返回前2000個分組。
sub_aggs和sub_group_bys
子統(tǒng)計聚合,子統(tǒng)計聚合會根據(jù)分組內(nèi)容再進行一次統(tǒng)計聚合分析。
場景
統(tǒng)計每個類別的商品數(shù)量,且統(tǒng)計每個類別價格的最大值和最小值。
方法
最外層的統(tǒng)計聚合是根據(jù)類別進行分組,再添加兩個子統(tǒng)計聚合求價格的最大值和最小值。
結(jié)果示例
水果:5個(其中價格的最大值為15,最小值為3)
洗漱用品:10個(其中價格的最大值為98,最小值為1)
電子設(shè)備: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);
范圍分組
根據(jù)一個字段的范圍對查詢結(jié)果進行分組,字段值在某范圍內(nèi)放到同一分組內(nèi),返回每個范圍中相應(yīng)的item個數(shù)。
參數(shù)
參數(shù)
說明
name
自定義的統(tǒng)計聚合名稱,用于區(qū)分不同的統(tǒng)計聚合,可根據(jù)此名稱獲取本次統(tǒng)計聚合結(jié)果。
field_name
用于統(tǒng)計聚合的字段,僅支持Long和Double類型。
ranges[from, to)
分組的范圍。
起始值from可以使用最小值Double.MIN_VALUE,結(jié)束值to可以使用最大值Double.MAX_VALUE。
sub_aggs和sub_group_bys
子統(tǒng)計聚合,子統(tǒng)計聚合會根據(jù)分組內(nèi)容再進行一次統(tǒng)計聚合分析。
例如按銷量分組后再按省份分組,即可獲得某個銷量范圍內(nèi)哪個省比重比較大,實現(xiàn)方法是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);
地理位置分組
根據(jù)距離某一個中心點的范圍對查詢結(jié)果進行分組,距離差值在某范圍內(nèi)放到同一分組內(nèi),返回每個范圍中相應(yīng)的item個數(shù)。
參數(shù)
參數(shù)
說明
name
自定義的統(tǒng)計聚合名稱,用于區(qū)分不同的統(tǒng)計聚合,可根據(jù)此名稱獲取本次統(tǒng)計聚合結(jié)果。
field_name
用于統(tǒng)計聚合的字段,僅支持Geo_point類型。
origin(lat, lon)
起始中心點的經(jīng)緯度。
lat是起始中心點緯度,lon是起始中心點經(jīng)度。
ranges[from, to)
分組的范圍,單位為米,from和to的值均為Double類型。
起始值from可以使用最小值Double.MIN_VALUE,結(jié)束值to可以使用最大值Double.MAX_VALUE。
sub_aggs和sub_group_bys
子統(tǒng)計聚合,子統(tǒng)計聚合會根據(jù)分組內(nèi)容再進行一次統(tǒng)計聚合分析。
示例
$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);
過濾條件分組
按照過濾條件對查詢結(jié)果進行分組,獲取每個過濾條件匹配到的數(shù)量,返回結(jié)果的順序和添加過濾條件的順序一致。
參數(shù)
參數(shù)
說明
name
自定義的統(tǒng)計聚合名稱,用于區(qū)分不同的統(tǒng)計聚合,可根據(jù)此名稱獲取本次統(tǒng)計聚合結(jié)果。
filters
過濾條件,返回結(jié)果的順序和添加過濾條件的順序一致。
sub_aggs和sub_group_bys
子統(tǒng)計聚合,子統(tǒng)計聚合會根據(jù)分組內(nèi)容再進行一次統(tǒng)計聚合分析。
示例
$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);
直方圖統(tǒng)計
按照指定數(shù)據(jù)間隔對查詢結(jié)果進行分組,字段值在相同范圍內(nèi)放到同一分組內(nèi),返回每個分組的值和該值對應(yīng)的個數(shù)。
參數(shù)
參數(shù)
說明
name
自定義的統(tǒng)計聚合名稱,用于區(qū)分不同的統(tǒng)計聚合,可根據(jù)此名稱獲取本次統(tǒng)計聚合結(jié)果。
field_name
用于統(tǒng)計聚合的字段,僅支持Long和Double類型。
interval
統(tǒng)計間隔。
field_range[min,max]
統(tǒng)計范圍,與interval參數(shù)配合使用限制分組的數(shù)量。
(field_range.max-field_range.min)/interval
的值不能超過2000。min_doc_count
最小行數(shù)。當分組中的行數(shù)小于最小行數(shù)時,不會返回此分組的統(tǒng)計結(jié)果。
missing
當某行數(shù)據(jù)中的字段為空時,字段值的默認值。
如果未設(shè)置missing值,則在統(tǒng)計聚合時會忽略該行。
如果設(shè)置了missing值,則使用missing值作為字段值的默認值參與統(tǒng)計聚合。
示例
$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);
嵌套
分組類型的統(tǒng)計聚合功能支持嵌套,其內(nèi)部可以添加子統(tǒng)計聚合。
主要用于在分組內(nèi)再次進行統(tǒng)計聚合,以兩層的嵌套為例:
GroupBy+SubGroupBy:按省份分組后再按照城市分組,獲取每個省份下每個城市的數(shù)據(jù)。
GroupBy+SubAggregation:按照省份分組后再求某個指標的最大值,獲取每個省的某個指標最大值。
為了性能、復(fù)雜度等綜合考慮,嵌套的層級只開放了一定的層數(shù)。更多信息,請參見多元索引限制。
$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);