日本熟妇hd丰满老熟妇,中文字幕一区二区三区在线不卡 ,亚洲成片在线观看,免费女同在线一区二区

統計聚合

使用統計聚合功能可以實現求最小值、求最大值、求和、求平均值、統計行數、去重統計行數、百分位統計、按字段值分組、按范圍分組、按地理位置分組、按過濾條件分組、直方圖統計、獲取統計聚合分組內的行、嵌套查詢等;同時多個統計聚合功能可以組合使用,滿足復雜的查詢需求。

流程

統計聚合的完整執行流程如下圖所示。

fig_agg_pro

統計聚合是在服務端的“查詢”結束后執行,服務端會將“查詢”階段命中的所有文檔根據查詢請求進行統計聚合,因此統計聚合請求相比沒有統計聚合的請求會復雜。

背景信息

統計聚合的詳細功能請參見下表。

功能

說明

最小值

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

最大值

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

返回數值字段的總數,類似于SQL中的sum。

平均值

返回數值字段的平均值,類似于SQL中的avg。

統計行數

返回指定字段值的數量或者多元索引數據總行數,類似于SQL中的count。

去重統計行數

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

百分位統計

百分位統計常用來統計一組數據的百分位分布情況,例如在日常系統運維中統計每次請求訪問的耗時情況時,需要關注系統請求耗時的P25、P50、P90、P99值等分布情況。

字段值分組

根據一個字段的值對查詢結果進行分組,相同的字段值放到同一分組內,返回每個分組的值和該值對應的個數。

說明

當分組較大時,按字段值分組可能會存在誤差。

范圍分組

根據一個字段的范圍對查詢結果進行分組,字段值在某范圍內放到同一分組內,返回每個范圍中相應的item個數。

地理位置分組

根據距離某一個中心點的范圍對查詢結果進行分組,距離差值在某范圍內放到同一分組內,返回每個范圍中相應的item個數。

過濾條件分組

按照過濾條件對查詢結果進行分組,獲取每個過濾條件匹配到的數量,返回結果的順序和添加過濾條件的順序一致。

直方圖統計

按照指定數據間隔對查詢結果進行分組,字段值在相同范圍內放到同一分組內,返回每個分組的值和該值對應的個數。

獲取統計聚合分組中的行

對查詢結果進行分組后,獲取每個分組內的一些行數據,可實現和MySQL中ANY_VALUE(field)類似的功能。

嵌套

分組類型的統計聚合功能支持嵌套,其內部可以添加子統計聚合。

多個統計聚合

多個統計聚合功能可以組合使用。

說明

當多個統計聚合的復雜度較高時可能會影響響應速度。

前提條件

  • 已初始化OTSClient。具體操作,請參見初始化
  • 已創建數據表并寫入數據。
  • 已在數據表上創建多元索引。具體操作,請參見創建多元索引。

最小值

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

  • 參數

    參數

    說明

    AggName

    自定義的統計聚合名稱,用于區分不同的統計聚合,可根據此名稱獲取本次統計聚合結果。

    FieldName

    用于統計聚合的字段,僅支持Long、Double和Date類型。

    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和Date類型。

    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和Date類型。

    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")));
    }

統計行數

返回指定字段值的數量或者多元索引數據總行數,類似于SQL中的count。

說明

通過如下方式可以統計多元索引數據總行數或者某個query匹配的行數。

  • 使用統計聚合的count功能,在請求中設置count(*)。

  • 使用query功能的匹配行數,在query中設置setGetTotalCount(true);如果需要統計多元索引數據總行數,則使用MatchAllQuery。

如果需要獲取多元索引數據某列出現的次數,則使用count(列名),可應用于稀疏列的場景。

  • 參數

    參數

    說明

    AggName

    自定義的統計聚合名稱,用于區分不同的統計聚合,可根據此名稱獲取本次統計聚合結果。

    FieldName

    用于統計聚合的字段,僅支持Long、Double、Boolean、Keyword、Geo_point和Date類型。

  • 示例

    /// <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")));
    }

去重統計行數

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

說明

去重統計行數的計算結果是個近似值。

  • 當去重統計行數小于1萬時,計算結果接近精確值。

  • 當去重統計行數達到1億時,計算結果的誤差為2%左右。

  • 參數

    參數

    說明

    AggName

    自定義的統計聚合名稱,用于區分不同的統計聚合,可根據此名稱獲取本次統計聚合結果。

    FieldName

    用于統計聚合的字段,僅支持Long、Double、Boolean、Keyword、Geo_point和Date類型。

    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值等分布情況。

說明

百分位統計為非精確統計,對不同百分位數值的計算精確度不同,較為極端的百分位數值更加準確,例如1%或99%的百分位數值會比50%的百分位數值準確。

  • 參數

    參數

    說明

    AggName

    自定義的統計聚合名稱,用于區分不同的統計聚合,可根據此名稱獲取本次統計聚合結果。

    FieldName

    用于統計聚合的字段,僅支持Long、Double和Date類型。

    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和Date類型。

    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));
}