使用統計彙總功能可以實現求最小值、求最大值、求和、求平均值、統計行數、去重統計行數、百分位統計、按欄位值分組、按範圍分組、按地理位置分組、按過濾條件分組、長條圖統計、擷取統計彙總分組內的行、巢狀查詢等;同時多個統計彙總功能可以組合使用,滿足複雜的查詢需求。
流程
統計彙總的完整執行流程如下圖所示。
統計彙總是在服務端的“查詢”結束後執行,服務端會將“查詢”階段命中的所有文檔根據查詢請求進行統計彙總,因此統計彙總請求相比沒有統計彙總的請求會複雜。
背景資訊
功能 | 說明 |
---|---|
最小值 | 返回一個欄位中的最小值,類似於SQL中的min。 |
最大值 | 返回一個欄位中的最大值,類似於SQL中的max。 |
和 | 返回數值欄位的總數,類似於SQL中的sum。 |
平均值 | 返回數值欄位的平均值,類似於SQL中的avg。 |
統計行數 | 返回指定欄位值的數量或者多元索引資料總行數,類似於SQL中的count。 |
去重統計行數 | 返回指定欄位不同值的數量,類似於SQL中的count(distinct)。 |
百分位統計 | 百分位統計常用來統計一組資料的百分位分布情況,例如在日常系統營運中統計每次請求訪問的耗時情況時,需要關注系統請求耗時的P25、P50、P90、P99值等分布情況。 |
欄位值分組 | 根據一個欄位的值對查詢結果進行分組,相同的欄位值放到同一分組內,返回每個分組的值和該值對應的個數。 说明 當分組較大時,按欄位值分組可能會存在誤差。 |
範圍分組 | 根據一個欄位的範圍對查詢結果進行分組,欄位值在某範圍內放到同一分組內,返回每個範圍中相應的item個數。 |
地理位置分組 | 根據距離某一個中心點的範圍對查詢結果進行分組,距離差值在某範圍內放到同一分組內,返回每個範圍中相應的item個數。 |
過濾條件分組 | 按照過濾條件對查詢結果進行分組,擷取每個過濾條件匹配到的數量,返回結果的順序和添加過濾條件的順序一致。 |
長條圖統計 | 按照指定資料間隔對查詢結果進行分組,欄位值在相同範圍內放到同一分組內,返回每個分組的值和該值對應的個數。 |
擷取統計彙總分組中的行 | 對查詢結果進行分組後,擷取每個分組內的一些行資料,可實現和MySQL中ANY_VALUE(field)類似的功能。 |
嵌套 | 分組類型的統計彙總功能支援嵌套,其內部可以添加子統計彙總。 |
多個統計彙總 | 多個統計彙總功能可以組合使用。 说明 當多個統計彙總的複雜度較高時可能會影響響應速度。 |
前提條件
最小值
返回一個欄位中的最小值,類似於SQL中的min。
- 參數
參數 說明 AggName 自訂的統計彙總名稱,用於區分不同的統計彙總,可根據此名稱擷取本次統計彙總結果。 FieldName 用於統計彙總的欄位,僅支援Long和Double類型。 Missing 當某行資料中的欄位為空白時,欄位值的預設值。
- 如果未設定Missing值,則在統計彙總時會忽略該行。
- 如果設定了Missing值,則使用Missing值作為欄位值的預設值參與統計彙總。
- 樣本
/// <summary> /// 最小值。 /// </summary> /// <param name="otsClient"></param> public static void MinAggregation(OTSClient otsClient) { MinAggregation minAggregation = new MinAggregation(); minAggregation.AggName = "Min_Agg"; minAggregation.FieldName = "pk1"; RangeQuery rangeQuery = new RangeQuery(); rangeQuery.FieldName = "pk1"; rangeQuery.From = new ColumnValue(0); rangeQuery.To = new ColumnValue(100); SearchQuery seachQuery = new SearchQuery { Limit = 0, Query = rangeQuery, AggregationList = new List<IAggregation> { minAggregation } }; SearchRequest searchRequest = new SearchRequest(TableName, IndexName, seachQuery); SearchResponse searchResponse = otsClient.Search(searchRequest); Console.WriteLine(JsonConvert.SerializeObject(searchResponse.AggregationResults.GetAsMinAggregationResult("Min_Agg"))); }
最大值
返回一個欄位中的最大值,類似於SQL中的max。
- 參數
參數 說明 AggName 自訂的統計彙總名稱,用於區分不同的統計彙總,可根據此名稱擷取本次統計彙總結果。 FieldName 用於統計彙總的欄位,僅支援Long和Double類型。 Missing 當某行資料中的欄位為空白時,欄位值的預設值。
- 如果未設定Missing值,則在統計彙總時會忽略該行。
- 如果設定了Missing值,則使用Missing值作為欄位值的預設值參與統計彙總。
- 樣本
/// <summary> /// 最大值。 /// </summary> /// <param name="otsClient"></param> public static void MaxAggregation(OTSClient otsClient) { MaxAggregation maxAggregation = new MaxAggregation(); maxAggregation.AggName = "Max_Agg"; maxAggregation.FieldName = "pk1"; RangeQuery rangeQuery = new RangeQuery(); rangeQuery.FieldName = "pk1"; rangeQuery.From = new ColumnValue(0); rangeQuery.To = new ColumnValue(100); SearchQuery seachQuery = new SearchQuery { Limit = 0, Query = rangeQuery, AggregationList = new List<IAggregation> { maxAggregation } }; SearchRequest searchRequest = new SearchRequest(TableName, IndexName, seachQuery); SearchResponse searchResponse = otsClient.Search(searchRequest); Console.WriteLine(JsonConvert.SerializeObject(searchResponse.AggregationResults.GetAsMaxAggregationResult("Max_Agg"))); }
和
返回數值欄位的總數,類似於SQL中的sum。
- 參數
參數 說明 AggName 自訂的統計彙總名稱,用於區分不同的統計彙總,可根據此名稱擷取本次統計彙總結果。 FieldName 用於統計彙總的欄位,僅支援Long和Double類型。 Missing 當某行資料中的欄位為空白時,欄位值的預設值。
- 如果未設定Missing值,則在統計彙總時會忽略該行。
- 如果設定了Missing值,則使用Missing值作為欄位值的預設值參與統計彙總。
- 樣本
/// <summary> /// 求和。 /// </summary> /// <param name="otsClient"></param> public static void SumAggregation(OTSClient otsClient) { SumAggregation sumAggregation = new SumAggregation(); sumAggregation.AggName = "Sum_Agg"; sumAggregation.FieldName = "pk1"; RangeQuery rangeQuery = new RangeQuery(); rangeQuery.FieldName = "pk1"; rangeQuery.From = new ColumnValue(0); rangeQuery.To = new ColumnValue(100); SearchQuery seachQuery = new SearchQuery { Limit = 0, Query = rangeQuery, AggregationList = new List<IAggregation> { sumAggregation } }; SearchRequest searchRequest = new SearchRequest(TableName, IndexName, seachQuery); SearchResponse searchResponse = otsClient.Search(searchRequest); Console.WriteLine(JsonConvert.SerializeObject(searchResponse.AggregationResults.GetAsSumAggregationResult("Sum_Agg"))); }
平均值
返回數值欄位的平均值,類似於SQL中的avg。
- 參數
參數 說明 AggName 自訂的統計彙總名稱,用於區分不同的統計彙總,可根據此名稱擷取本次統計彙總結果。 FieldName 用於統計彙總的欄位,僅支援Long和Double類型。 Missing 當某行資料中的欄位為空白時,欄位值的預設值。
- 如果未設定Missing值,則在統計彙總時會忽略該行。
- 如果設定了Missing值,則使用Missing值作為欄位值的預設值參與統計彙總。
- 樣本
/// <summary> /// 求平均值。 /// </summary> /// <param name="otsClient"></param> public static void AvgAggregation(OTSClient otsClient) { AvgAggregation avgAggregation = new AvgAggregation(); avgAggregation.AggName = "Avg_Agg"; avgAggregation.FieldName = "pk1"; RangeQuery rangeQuery = new RangeQuery(); rangeQuery.FieldName = "pk1"; rangeQuery.From = new ColumnValue(0); rangeQuery.To = new ColumnValue(100); SearchQuery seachQuery = new SearchQuery { Limit = 0, Query = rangeQuery, AggregationList = new List<IAggregation> { avgAggregation } }; SearchRequest searchRequest = new SearchRequest(TableName, IndexName, seachQuery); SearchResponse searchResponse = otsClient.Search(searchRequest); Console.WriteLine(JsonConvert.SerializeObject(searchResponse.AggregationResults.GetAsAvgAggregationResult("Avg_Agg"))); }
統計行數
- 使用統計彙總的count功能,在請求中設定count(*)。
- 使用query功能的匹配行數,在query中設定setGetTotalCount(true);如果需要統計多元索引資料總行數,則使用MatchAllQuery。
如果需要擷取多元索引資料某列出現的次數,則使用count(列名),可應用於稀疏列的情境。
- 參數
參數 說明 AggName 自訂的統計彙總名稱,用於區分不同的統計彙總,可根據此名稱擷取本次統計彙總結果。 FieldName 用於統計彙總的欄位,僅支援Long、Double、Boolean、Keyword和Geo_point類型。 - 樣本
/// <summary> /// 統計行數。 /// </summary> /// <param name="otsClient"></param> public static void CountAggregation(OTSClient otsClient) { CountAggregation countAggregation = new CountAggregation(); countAggregation.AggName = "Count_Agg"; countAggregation.FieldName = "pk1"; RangeQuery rangeQuery = new RangeQuery(); rangeQuery.FieldName = "pk1"; rangeQuery.From = new ColumnValue(0); rangeQuery.To = new ColumnValue(100); SearchQuery seachQuery = new SearchQuery { Limit = 0, Query = rangeQuery, AggregationList = new List<IAggregation> { countAggregation } }; SearchRequest searchRequest = new SearchRequest(TableName, IndexName, seachQuery); SearchResponse searchResponse = otsClient.Search(searchRequest); Console.WriteLine(JsonConvert.SerializeObject(searchResponse.AggregationResults.GetAsCountAggregationResult("Count_Agg"))); }
去重統計行數
- 當去重統計行數小於1萬時,計算結果接近精確值。
- 當去重統計行數達到1億時,計算結果的誤差為2%左右。
- 參數
參數 說明 AggName 自訂的統計彙總名稱,用於區分不同的統計彙總,可根據此名稱擷取本次統計彙總結果。 FieldName 用於統計彙總的欄位,僅支援Long、Double、Boolean、Keyword和Geo_point類型。 Missing 當某行資料中的欄位為空白時,欄位值的預設值。
- 如果未設定Missing值,則在統計彙總時會忽略該行。
- 如果設定了Missing值,則使用Missing值作為欄位值的預設值參與統計彙總。
- 樣本
/// <summary> /// 去重統計行數。 /// </summary> /// <param name="otsClient"></param> public static void DistinctCountAggregation(OTSClient otsClient) { DistinctCountAggregation distinctCountAggregation = new DistinctCountAggregation(); distinctCountAggregation.AggName = "DistinctCount_Agg"; distinctCountAggregation.FieldName = "pk1"; TermsQuery termsQuery = new TermsQuery(); termsQuery.FieldName = "pk0"; termsQuery.Terms = new List<ColumnValue> { new ColumnValue("Sample"), new ColumnValue("SearchIndex") }; SearchQuery seachQuery = new SearchQuery { Limit = 0, Query = termsQuery, AggregationList = new List<IAggregation> { distinctCountAggregation } }; SearchRequest searchRequest = new SearchRequest(TableName, IndexName, seachQuery); SearchResponse searchResponse = otsClient.Search(searchRequest); Console.WriteLine(JsonConvert.SerializeObject(searchResponse.AggregationResults.GetAsDistinctCountAggregationResult("DistinctCount_Agg"))); }
百分位統計
百分位統計常用來統計一組資料的百分位分布情況,例如在日常系統營運中統計每次請求訪問的耗時情況時,需要關注系統請求耗時的P25、P50、P90、P99值等分布情況。
- 參數
參數 說明 AggName 自訂的統計彙總名稱,用於區分不同的統計彙總,可根據此名稱擷取本次統計彙總結果。 FieldName 用於統計彙總的欄位,僅支援Long和Double類型。 Percentiles 百分位分布例如50、90、99,可根據需要設定一個或者多個百分位。 Missing 當某行資料中的欄位為空白時,欄位值的預設值。 - 如果未設定Missing值,則在統計彙總時會忽略該行。
- 如果設定了Missing值,則使用Missing值作為欄位值的預設值參與統計彙總。
- 樣本
/// <summary> /// 百分位統計。 /// </summary> /// <param name="otsClient"></param> public static void PercentilesAggregation(OTSClient otsClient) { PercentilesAggregation percentilesAggregation = new PercentilesAggregation(); percentilesAggregation.AggName = "Percentiles_Agg"; percentilesAggregation.FieldName = "pk1"; percentilesAggregation.Missing = new ColumnValue(10); percentilesAggregation.Percentiles = new List<double> { 10.0, 30.0, 60.0, 90.0, 100.0 }; MatchAllQuery matchAllQuery = new MatchAllQuery(); SearchQuery searchQuery = new SearchQuery(); searchQuery.AggregationList = new List<IAggregation> { percentilesAggregation }; searchQuery.Query = matchAllQuery; searchQuery.Limit = 0; SearchRequest searchRequest = new SearchRequest(TableName, IndexName, searchQuery); SearchResponse searchResponse = otsClient.Search(searchRequest); Console.WriteLine(JsonConvert.SerializeObject(searchResponse)); }
欄位值分組
- 參數
參數 說明 GroupByName 自訂的統計彙總名稱,用於區分不同的統計彙總,可根據此名稱擷取本次統計彙總結果。 FieldName 用於統計彙總的欄位,僅支援Long、Double、Boolean和Keyword類型。 Size 返回的分組數量,預設值為10。最大值為2000。當分組數量超過2000時,只會返回前2000個分組。 GroupBySorters 分組中的item定序,預設按照分組中item的數量降序排序,多個排序則按照添加的順序進行排列。支援的參數如下: - 按照值的字典序升序排列
- 按照值的字典序降序排列
- 按照行數升序排列
- 按照行數降序排列
- 按照子統計彙總結果中值升序排列
- 按照子統計彙總結果中值降序排列
SubAggregation和SubGroupBy 子統計彙總,子統計彙總會根據分組內容再進行一次統計彙總分析。 - 情境
統計每個類別的商品數量,且統計每個類別價格的最大值和最小值。
- 方法
最外層的統計彙總是根據類別進行分組,再添加兩個子統計彙總求價格的最大值和最小值。
- 結果樣本
- 水果:5個(其中價格的最大值為15,最小值為3)
- 洗漱用品:10個(其中價格的最大值為98,最小值為1)
- 電子裝置:3個(其中價格的最大值為8699,最小值為2300)
- 其它:15個(其中價格的最大值為1000,最小值為80)
- 樣本
/// <summary> /// 欄位值分組。 /// </summary> /// <param name="otsClient"></param> public static void GroupByField(OTSClient otsClient) { GroupByField groupByField = new GroupByField { GroupByName = "GroupBy_Field", FieldName = "pk0", GroupBySorters = new List<GroupBySorter>{ new GroupBySorter() { RowCountSort = new RowCountSort{ Order = SortOrder.DESC } }, new GroupBySorter() { GroupKeySort = new GroupKeySort{ Order = SortOrder.DESC } } } }; MatchAllQuery matchAllQuery = new MatchAllQuery(); SearchQuery searchQuery = new SearchQuery(); searchQuery.GroupByList = new List<IGroupBy> { groupByField }; searchQuery.Query = matchAllQuery; searchQuery.Limit = 0; SearchRequest searchRequest = new SearchRequest(TableName, IndexName, searchQuery); SearchResponse searchResponse = otsClient.Search(searchRequest); Console.WriteLine(JsonConvert.SerializeObject(searchResponse)); }
範圍分組
根據一個欄位的範圍對查詢結果進行分組,欄位值在某範圍內放到同一分組內,返回每個範圍中相應的item個數。
- 參數
參數 說明 GroupByName 自訂的統計彙總名稱,用於區分不同的統計彙總,可根據此名稱擷取本次統計彙總結果。 FieldName 用於統計彙總的欄位,僅支援Long和Double類型。 Range[double_from, double_to) 分組的範圍。 起始值double_from可以使用最小值double.MinValue,結束值double_to可以使用最大值double.MaxValue。
SubAggregation和SubGroupBy 子統計彙總,子統計彙總會根據分組內容再進行一次統計彙總分析。 例如按銷量分組後再按省份分組,即可獲得某個銷量範圍內哪個省比重比較大,實現方法是GroupByRange下添加一個GroupByField。
- 樣本
/// <summary> /// 範圍分組。 /// </summary> /// <param name="otsClient"></param> public static void GroupByRange(OTSClient otsClient) { GroupByRange groupByRange = new GroupByRange(); groupByRange.GroupByName = "GroupBy_Range"; groupByRange.FieldName = "pk1"; groupByRange.Ranges = new List<Range> { new Range(double.MinValue, 5.0), new Range(5.0, 50.0), new Range(50.0, 100.0), new Range(100.0, double.MaxValue) }; MatchAllQuery matchAllQuery = new MatchAllQuery(); SearchQuery searchQuery = new SearchQuery(); searchQuery.GroupByList = new List<IGroupBy> { groupByRange }; searchQuery.Query = matchAllQuery; searchQuery.Limit = 0; SearchRequest searchRequest = new SearchRequest(TableName, IndexName, searchQuery); SearchResponse searchResponse = otsClient.Search(searchRequest); Console.WriteLine(JsonConvert.SerializeObject(searchResponse)); }
地理位置分組
根據距離某一個中心點的範圍對查詢結果進行分組,距離差值在某範圍內放到同一分組內,返回每個範圍中相應的item個數。
- 參數
參數 說明 GroupByName 自訂的統計彙總名稱,用於區分不同的統計彙總,可根據此名稱擷取本次統計彙總結果。 FieldName 用於統計彙總的欄位,僅支援Geo_point類型。 Origin(double latitude, double longitude) 起始中心點的經緯度。 latitude是起始中心點座標緯度,longitude是起始中心點座標經度。
Range[double_from, double_to) 分組的範圍,單位為米。 起始值double_from可以使用最小值double.MinValue,結束值double_to可以使用最大值double.MaxValue。
SubAggregation和SubGroupBy 子統計彙總,子統計彙總會根據分組內容再進行一次統計彙總分析。 - 樣本
/// <summary> /// 地理位置分組。 /// </summary> /// <param name="otsClient"></param> public static void GroupByGeoDistance(OTSClient otsClient) { GroupByGeoDistance groupByGeoDistance = new GroupByGeoDistance { GroupByName = "GroupBy_GeoDistance", FieldName = "geo_col", Origin = new GeoPoint(0, 0), Ranges = new List<Range> { new Range(double.MinValue , 1000.0), new Range(1000.0, 5000.0), new Range(5000.0, double.MaxValue) } }; MatchAllQuery matchAllQuery = new MatchAllQuery(); SearchQuery searchQuery = new SearchQuery(); searchQuery.GroupByList = new List<IGroupBy> { groupByGeoDistance }; searchQuery.Query = matchAllQuery; searchQuery.Limit = 0; SearchRequest searchRequest = new SearchRequest(TableName, IndexName, searchQuery); SearchResponse searchResponse = otsClient.Search(searchRequest); Console.WriteLine(JsonConvert.SerializeObject(searchResponse)); }
過濾條件分組
按照過濾條件對查詢結果進行分組,擷取每個過濾條件匹配到的數量,返回結果的順序和添加過濾條件的順序一致。
- 參數
參數 說明 GroupByName 自訂的統計彙總名稱,用於區分不同的統計彙總,可根據此名稱擷取本次統計彙總結果。 Filters 過濾條件,返回結果的順序和添加過濾條件的順序一致。 SubAggregation和SubGroupBy 子統計彙總,子統計彙總會根據分組內容再進行一次統計彙總分析。 - 樣本
/// <summary> /// 過濾條件分組。 /// </summary> /// <param name="otsClient"></param> public static void GroupByFilter(OTSClient otsClient) { GroupByFilter groupByFilter = new GroupByFilter { GroupByName = "GroupBy_Filter", Filters = new List<IQuery> { new RangeQuery { FieldName = "pk1", From = new ColumnValue(0.0), To = new ColumnValue(5.0) }, } }; TermsQuery termsQuery = new TermsQuery(); termsQuery.FieldName = "pk0"; termsQuery.Terms = new List<ColumnValue> { new ColumnValue("Tablestore SearchIndex"), new ColumnValue("SearchIndex") }; SearchQuery searchQuery = new SearchQuery(); searchQuery.GroupByList = new List<IGroupBy> { groupByFilter }; searchQuery.Query = termsQuery; searchQuery.Limit = 0; SearchRequest searchRequest = new SearchRequest(TableName, IndexName, searchQuery); SearchResponse searchResponse = otsClient.Search(searchRequest); Console.WriteLine(JsonConvert.SerializeObject(searchResponse)); }
長條圖統計
按照指定資料間隔對查詢結果進行分組,欄位值在相同範圍內放到同一分組內,返回每個分組的值和該值對應的個數。
- 參數
參數 說明 GroupByName 自訂的統計彙總名稱,用於區分不同的統計彙總,可根據此名稱擷取本次統計彙總結果。 FieldName 用於統計彙總的欄位,僅支援Long和Double類型。 Interval 統計間隔。 FieldRange[min,max] 統計範圍,與Interval參數配合使用限制分組的數量。 (FieldRange.max-FieldRange.min)/Interval
的值不能超過2000。MinDocCount 最小行數。當分組中的行數小於最小行數時,不會返回此分組的統計結果。 Missing 當某行資料中的欄位為空白時,欄位值的預設值。 - 如果未設定Missing值,則在統計彙總時會忽略該行。
- 如果設定了Missing值,則使用Missing值作為欄位值的預設值參與統計彙總。
- 樣本
/// <summary> /// 長條圖統計。 /// </summary> /// <param name="otsClient"></param> public static void HistogramAggregation(OTSClient otsClient) { GroupByHistogram groupByHistogram = new GroupByHistogram(); groupByHistogram.GroupByName = "GroupBy_Histogram"; groupByHistogram.FieldName = "pk1"; groupByHistogram.Interval = new ColumnValue(5); groupByHistogram.Missing = new ColumnValue(100); groupByHistogram.FieldRange = new FieldRange(new ColumnValue(0), new ColumnValue(1000)); MatchAllQuery matchAllQuery = new MatchAllQuery(); ; SearchQuery searchQuery = new SearchQuery(); searchQuery.Query = matchAllQuery; searchQuery.Limit = 0; searchQuery.GroupByList = new List<IGroupBy> { groupByHistogram }; SearchRequest searchRequest = new SearchRequest(TableName, IndexName, searchQuery); SearchResponse searchResponse = otsClient.Search(searchRequest); foreach (GroupByHistogramResultItem item in searchResponse.GroupByResults.GetAsGroupByHistogramResult("GroupBy_Histogram").GroupByHistogramResultItems) { Console.WriteLine(JsonConvert.SerializeObject(item)); } }
擷取統計彙總分組中的行
對查詢結果進行分組後,擷取每個分組內的一些行資料,可實現和MySQL中ANY_VALUE(field)類似的功能。
- 參數
參數 說明 AggName 自訂的統計彙總名稱,用於區分不同的統計彙總,可根據此名稱擷取本次統計彙總結果。 Limit 每個分組內最多返回的資料行數,預設返回1行資料。 Sort 分組內資料的排序方式。 ColumnsToGet 指定返回的欄位,僅支援多元索引中的欄位,且不支援數組、Date、Geopoint和Nested類型的欄位。 該參數複用SearchRequest中的columnsToGet參數,在SearchRequest中指定columnsToGet即可。
- 樣本
/// <summary> /// 擷取統計彙總分組中的行。 /// </summary> /// <param name="otsClient"></param> public static void TopRowsAggregation(OTSClient otsClient) { GroupByField groupByField = new GroupByField(); groupByField.GroupByName = "GroupBy_Field"; groupByField.FieldName = "pk0"; groupByField.SubAggregations = new List<IAggregation> { new TopRowsAggregation { AggName = "TopRows_Agg", Sort = new Sort(new List<ISorter> { new FieldSort("pk1", SortOrder.DESC) }), Limit = 2 } }; MatchAllQuery matchAllQuery = new MatchAllQuery(); ; SearchQuery searchQuery = new SearchQuery(); searchQuery.Query = matchAllQuery; searchQuery.Limit = 0; searchQuery.GroupByList = new List<IGroupBy> { groupByField }; SearchRequest searchRequest = new SearchRequest(TableName, IndexName, searchQuery); SearchResponse searchResponse = otsClient.Search(searchRequest); foreach (GroupByFieldResultItem item in searchResponse.GroupByResults.GetAsGroupByFieldResult("GroupBy_Field").GroupByFieldResultItems) { foreach (Row row in item.SubAggregationResults.GetAsTopRowsAggregationResult("TopRows_Agg").Rows) { Console.WriteLine(JsonConvert.SerializeObject(row)); } } }
嵌套
分組類型的統計彙總功能支援嵌套,其內部可以添加子統計彙總。
- GroupBy+SubGroupBy:按省份分組後再按照城市分組,擷取每個省份下每個城市的資料。
- GroupBy+SubAggregation:按照省份分組後再求某個指標的最大值,擷取每個省的某個指標最大值。
/// <summary>
/// 嵌套。
/// </summary>
/// <param name="otsClient"></param>
public static void SubGroupBy(OTSClient otsClient)
{
GroupByField groupByField = new GroupByField();
groupByField.GroupByName = "Field_GroupBy";
groupByField.FieldName = "pk0";
groupByField.SubGroupBys = new List<IGroupBy>
{
new GroupByRange
{
GroupByName = "Range_GroupBy",
FieldName = "pk1",
Ranges = new List<Range>
{
new Range(double.MinValue, 5),
new Range(5,100),
new Range(100, double.MaxValue)
}
}
};
MatchAllQuery matchAllQuery = new MatchAllQuery();
SearchQuery searchQuery = new SearchQuery();
searchQuery.GroupByList = new List<IGroupBy>
{
groupByField
};
searchQuery.GetTotalCount = true;
searchQuery.Limit = 0;
searchQuery.Query = matchAllQuery;
SearchRequest searchRequest = new SearchRequest(TableName, IndexName, searchQuery);
SearchResponse searchResponse = otsClient.Search(searchRequest);
foreach (GroupByFieldResultItem item in searchResponse.GroupByResults.GetAsGroupByFieldResult("Field_GroupBy").GroupByFieldResultItems)
{
Console.WriteLine(JsonConvert.SerializeObject(item.SubGroupByResults.GetAsGroupByRangeResult("Range_GroupBy")));
}
}
多個統計彙總
/// <summary>
/// 多個統計彙總。
/// </summary>
/// <param name="otsClient"></param>
public static void MultipleAggregation(OTSClient otsClient)
{
MaxAggregation maxAggregation = new MaxAggregation();
maxAggregation.AggName = "Max_Agg";
maxAggregation.FieldName = "pk1";
MinAggregation minAggregation = new MinAggregation();
minAggregation.AggName = "Min_Agg";
minAggregation.FieldName = "pk1";
SumAggregation sumAggregation = new SumAggregation();
sumAggregation.AggName = "Sum_Agg";
sumAggregation.FieldName = "pk1";
SearchQuery searchQuery = new SearchQuery();
searchQuery.Limit = 0;
searchQuery.Query = new MatchAllQuery();
searchQuery.AggregationList = new List<IAggregation>
{
maxAggregation,
minAggregation,
sumAggregation
};
SearchRequest searchRequest = new SearchRequest(TableName, IndexName, searchQuery);
SearchResponse searchResponse = otsClient.Search(searchRequest);
Console.WriteLine(JsonConvert.SerializeObject(searchResponse));
}