使用統計彙總功能可以實現求最小值、求最大值、求和、求平均值、統計行數、去重統計行數、按欄位值分組、按範圍分組、按地理位置分組、按過濾條件分組等操作;同時多個統計彙總功能可以組合使用,滿足複雜的查詢需求。
流程
統計彙總的完整執行流程如下圖所示。
統計彙總是在服務端的“查詢”結束後執行,服務端會將“查詢”階段命中的所有文檔根據查詢請求進行統計彙總,因此統計彙總請求相比沒有統計彙總的請求會複雜。
背景資訊
功能 | 說明 |
---|---|
最小值 | 返回一個欄位中的最小值,類似於SQL中的min。 |
最大值 | 返回一個欄位中的最大值,類似於SQL中的max。 |
和 | 返回數值欄位的總數,類似於SQL中的sum。 |
平均值 | 返回數值欄位的平均值,類似於SQL中的avg。 |
統計行數 | 返回指定欄位值的數量或者多元索引資料總行數,類似於SQL中的count。 |
去重統計行數 | 返回指定欄位不同值的數量,類似於SQL中的count(distinct)。 |
百分位統計 | 百分位統計常用來統計一組資料的百分位分布情況,例如在日常系統營運中統計每次請求訪問的耗時情況時,需要關注系統請求耗時的P25、P50、P90、P99值等分布情況。 |
TopRows | 基於特定欄位排序的TopRows統計。 |
欄位值分組 | 根據一個欄位的值對查詢結果進行分組,相同的欄位值放到同一分組內,返回每個分組的值和該值對應的個數。 说明 當分組較大時,按欄位值分組可能會存在誤差。 |
範圍分組 | 根據一個欄位的範圍對查詢結果進行分組,欄位值在某範圍內放到同一分組內,返回每個範圍中相應的item個數。 |
地理位置分組 | 根據距離某一個中心點的範圍對查詢結果進行分組,距離差值在某範圍內放到同一分組內,返回每個範圍中相應的item個數。 |
過濾條件分組 | 按照過濾條件對查詢結果進行分組,擷取每個過濾條件匹配到的數量,返回結果的順序和添加過濾條件的順序一致。 |
長條圖統計 | 按照指定資料間隔對查詢結果進行分組,欄位值在相同範圍內放到同一分組內,返回每個分組的值和該值對應的個數。 |
嵌套 | 分組類型的統計彙總功能支援嵌套,其內部可以添加子統計彙總。 |
前提條件
最小值
返回一個欄位中的最小值,類似於SQL中的min。
- 參數
參數 說明 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_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類型。 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類型。 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);
統計行數
- 使用統計彙總的count功能,在請求中設定count(*)。
- 使用query功能的匹配行數,在query中設定setGetTotalCount(true);如果需要統計多元索引資料總行數,則使用MatchAllQuery。
如果需要擷取多元索引資料某列出現的次數,則使用count(列名),可應用於稀疏列的情境。
- 參數
參數 說明 name 自訂的統計彙總名稱,用於區分不同的統計彙總,可根據此名稱擷取本次統計彙總結果。 field_name 用於統計彙總的欄位,僅支援Long、Double、Boolean、Keyword和Geo_point類型。 - 樣本
$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);
去重統計行數
- 當去重統計行數小於1萬時,計算結果接近精確值。
- 當去重統計行數達到1億時,計算結果的誤差為2%左右。
- 參數
參數 說明 name 自訂的統計彙總名稱,用於區分不同的統計彙總,可根據此名稱擷取本次統計彙總結果。 field_name 用於統計彙總的欄位,僅支援Long、Double、Boolean、Keyword和Geo_point類型。 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值等分布情況。
- 參數
參數 說明 name 自訂的統計彙總名稱,用於區分不同的統計彙總,可根據此名稱擷取本次統計彙總結果。 field_name 用於統計彙總的欄位,僅支援Long和Double類型。 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類型。 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);