すべてのプロダクト
Search
ドキュメントセンター

Tablestore:集計

最終更新日:Dec 28, 2024

行の最小値、最大値、合計、平均値、件数、個別件数、パーセンタイル統計を取得するための集計操作を実行できます。また、フィールド値、範囲、地理的位置、フィルター、ヒストグラム、または日付ヒストグラム別に結果をグループ化し、ネストされたクエリを実行するための集計操作を実行することもできます。複雑なクエリに対して複数の集計操作を実行できます。

手順

次の図は、完全な集計手順を示しています。

fig_agg_pro

サーバーは、クエリ条件を満たすデータをクエリし、リクエストに基づいてデータの集計を実行します。そのため、集計を必要とするリクエストは、集計を必要としないリクエストよりも複雑です。

背景情報

次の表は、集計方法について説明しています。

方法

説明

最小値

フィールドの最小値を返すために使用できる集計方法。この方法は、SQLのMIN関数と同様の方法で使用できます。

最大値

フィールドの最大値を返すために使用できる集計方法。この方法は、SQLのMAX関数と同様の方法で使用できます。

合計

数値フィールドのすべての値の合計を返すために使用できる集計方法。この方法は、SQLのSUM関数と同様の方法で使用できます。

平均値

数値フィールドのすべての値の平均を返すために使用できる集計方法。この方法は、SQLのAVG関数と同様の方法で使用できます。

件数

フィールドの値の総数または検索インデックス内の行の総数を返すために使用できる集計方法。この方法は、SQLのCOUNT関数と同様の方法で使用できます。

個別件数

フィールドの個別値の数を返すために使用できる集計方法。この方法は、SQLのCOUNT(DISTINCT)関数と同様の方法で使用できます。

パーセンタイル統計

パーセンタイル値は、データセット内の値の相対位置を示します。たとえば、システムの日常的なO&M中に各リクエストの応答時間に関する統計を収集する場合、p25、p50、p90、p99などのパーセンタイルを使用して応答時間の分布を分析する必要があります。

フィールド値によるグループ化

フィールド値に基づいてクエリ結果をグループ化するために使用できる集計方法。同じ値は一緒にグループ化されます。同一の値は一緒にグループ化されます。各グループの同一値と各グループ内の同一値の数が返されます。

説明

グループに過度に多数の値が含まれている場合、計算された数値は実際の数値と異なる場合があります。

複数のフィールドによるグループ化

複数のフィールドに基づいてクエリ結果をグループ化するために使用できる集計方法。トークンを使用してページングを実行できます。

範囲によるグループ化

フィールドの値の範囲に基づいてクエリ結果をグループ化するために使用できる集計方法。指定された範囲内にあるフィールド値は一緒にグループ化されます。各範囲内の値の数が返されます。

地理的位置によるグループ化

地理的位置から中心点までの距離に基づいてクエリ結果をグループ化するために使用できる集計方法。指定された範囲内にある距離のクエリ結果は一緒にグループ化されます。各範囲内の項目数が返されます。

フィルターによるグループ化

クエリ結果をフィルタリングし、各フィルターに基づいてグループ化して、一致する結果の数を取得するために使用できる集計方法。結果は、フィルターが指定された順序で返されます。

ヒストグラムによるクエリ

この集計方法は、特定のデータ間隔に基づいてクエリ結果をグループ化するために使用できます。同じ範囲内にあるフィールド値は一緒にグループ化されます。各グループの値の範囲と各グループ内の値の数が返されます。

日付ヒストグラムによるクエリ

特定の日付間隔に基づいてクエリ結果をグループ化するために使用できる集計方法。同じ範囲内にあるフィールド値は一緒にグループ化されます。各グループの値の範囲と各グループ内の値の数が返されます。

各グループの集計操作の結果から取得された行をクエリする

クエリ結果をグループ化した後、各グループの行をクエリできます。この方法は、MySQLのANY_VALUE(field)と同様の方法で使用できます。

ネスト

GroupByはネストをサポートしています。GroupByを使用してサブ集計操作を実行できます。

複数の集計

複数の集計操作を実行できます。

説明

複数の複雑な集計操作を同時に実行すると、長時間を要する場合があります。

前提条件

最小値

フィールドの最小値を返すために使用できる集計方法。この方法は、SQLのMIN関数と同様の方法で使用できます。

  • パラメーター

    パラメーター

    説明

    AggName

    集計操作の一意の名前。この名前を使用して、特定の集計操作の結果をクエリできます。

    FieldName

    集計操作を実行するために使用されるフィールドの名前。LONG、DOUBLE、およびDATE型のみがサポートされています。

    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に値を指定した場合、このパラメーターの値が行のフィールド値として使用されます。

  • /// <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に値を指定した場合、このパラメーターの値が行のフィールド値として使用されます。

  • /// <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に値を指定した場合、このパラメーターの値が行のフィールド値として使用されます。

  • /// <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関数と同様の方法で使用できます。

説明

検索インデックス内の行の総数、またはクエリ条件を満たす行の総数をクエリするには、次の方法を使用できます。

  • 集計の件数機能を使用し、リクエストでcount(*)を指定します。

  • クエリ機能を使用して、クエリ条件を満たす行の数を取得します。クエリで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)関数と同様の方法で使用できます。

説明

個別値の数は概算です。

  • 個別件数機能を使用する前の行の総数が10,000未満の場合、計算結果は正確な値に近くなります。

  • 個別件数機能を使用する前の行の総数が1億以上の場合、エラー率は約2%です。

  • パラメーター

    パラメーター

    説明

    AggName

    集計操作の一意の名前。この名前を使用して、特定の集計操作の結果をクエリできます。

    FieldName

    集計操作を実行するために使用されるフィールドの名前。LONG、DOUBLE、BOOLEAN、KEYWORD、GEO_POINT、およびDATE型のみがサポートされています。

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

パーセンタイル統計

パーセンタイル値は、データセット内の値の相対位置を示します。たとえば、システムの日常的なO&M中に各リクエストの応答時間に関する統計を収集する場合、p25、p50、p90、p99などのパーセンタイルを使用して応答時間の分布を分析する必要があります。

説明
  • パラメーター

    パラメーター

    説明

    AggName

    集計操作の一意の名前。この名前を使用して、特定の集計操作の結果をクエリできます。

    FieldName

    集計操作を実行するために使用されるフィールドの名前。LONG、DOUBLE、およびDATE型のみがサポートされています。

    Percentiles

    p50、p90、p99などのパーセンタイル。1つ以上のパーセンタイルを指定できます。

    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。グループの数が2,000を超える場合、最初の2,000グループのみが返されます。

    GroupBySorters

    グループの並べ替えルール。デフォルトでは、グループはグループ内の項目数に基づいて降順に並べ替えられます。複数の並べ替えルールを設定した場合、グループはルールが設定された順序に基づいて並べ替えられます。サポートされているパラメーター:

    • 値でアルファベット順に並べ替える。

    • 値でアルファベットの逆順に並べ替える。

    • 行数で昇順に並べ替える。

    • 行数で降順に並べ替える。

    • サブ集計結果から取得された値で昇順に並べ替える。

    • サブ集計結果から取得された値で降順に並べ替える。

    SubAggregation and SubGroupBy

    サブ集計操作。グループ化結果に基づいてサブ集計操作を実行できます。

    • シナリオ

      各カテゴリの製品数、および各カテゴリの製品の最高価格と最低価格をクエリします。

    • 方法

      製品カテゴリ別にクエリ結果をグループ化して、各カテゴリの製品数を取得します。次に、2つのサブ集計操作を実行して、各カテゴリの製品の最高価格と最低価格を取得します。

    • 結果例

      • 果物:5。最高価格は15人民元。最低価格は3人民元。

      • トイレタリー:10。最高価格は98人民元。最低価格は1人民元。

      • 電子機器:3。最高価格は8,699人民元。最低価格は2,300人民元。

      • その他の製品:15。最高価格は1,000人民元。最低価格は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));
    }

範囲によるグループ化

フィールドの値の範囲に基づいてクエリ結果をグループ化するために使用できる集計方法。指定された範囲内にあるフィールド値は一緒にグループ化されます。各範囲内の値の数が返されます。

  • パラメーター

    パラメーター

    説明

    GroupByName

    集計操作の一意の名前。この名前を使用して、特定の集計操作の結果をクエリできます。

    FieldName

    集計操作を実行するために使用されるフィールドの名前。LONGおよびDOUBLE型のみがサポートされています。

    Range[double_from, double_to)

    グループ化の値の範囲。

    値の範囲はdouble.MinValueから始まり、double.MaxValueで終わることができます。

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

地理的位置によるグループ化

地理的位置から中心点までの距離に基づいてクエリ結果をグループ化するために使用できる集計方法。指定された範囲内にある距離のクエリ結果は一緒にグループ化されます。各範囲内の項目数が返されます。

  • パラメーター

    パラメーター

    説明

    GroupByName

    集計操作の一意の名前。この名前を使用して、特定の集計操作の結果をクエリできます。

    FieldName

    集計操作に使用されるフィールドの名前。GEOPOINT型のみがサポートされています。

    Origin(double latitude, double longitude)

    中心点の経度と緯度。

    latitudeは中心点の緯度を指定します。longitudeは中心点の経度を指定します。

    Range[double_from, double_to)

    グループ化に使用される距離範囲。単位:メートル。

    値の範囲はdouble.MinValueから始まり、double.MaxValueで終わることができます。

    SubAggregation and 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 and 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式を使用して計算された値は2,000を超えることはできません。

    MinDocCount

    行の最小数。グループ内の行数が行の最小数よりも少ない場合、グループの集計結果は返されません。

    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)と同様の方法で使用できます。

説明

各グループの集計操作の結果から取得された行をクエリする場合、検索インデックスにNESTED、GEOPOINT、またはARRAYフィールドが含まれていると、返される結果にはプライマリキー情報のみが含まれます。必要なフィールドを取得するには、データテーブルをクエリする必要があります。

  • パラメーター

    パラメーター

    説明

    AggName

    集計操作の一意の名前。この名前を使用して、特定の集計操作の結果をクエリできます。

    Limit

    各グループに返される行の最大数。デフォルトでは、1行のデータのみが返されます。

    Sort

    グループ内のデータを並べ替えるために使用される並べ替え方法。

    ColumnsToGet

    返されるフィールド。検索インデックス内のフィールドのみがサポートされています。ARRAY、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はネストをサポートしています。GroupByを使用してサブ集計操作を実行できます。

ネストを使用して、グループ内でサブ集計操作を実行できます。たとえば、最大2レベルまでネスト集計操作を実行できます。

  • GroupBy + SubGroupBy:項目は県別および市別にグループ化され、各県の各市のデータが取得されます。

  • GroupBy + SubAggregation:項目は県別にグループ化され、メトリックの最大値が計算されて、各県のメトリックの最大値が取得されます。

説明

複雑なGroupBy操作の高パフォーマンスを確保するために、ネストのレベル数を少なく指定できます。詳細については、検索インデックスの制限を参照してください。

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