集計操作を実行して、行の最小値、最大値、合計、平均値、カウント、個別カウントを取得できます。また、集計操作を実行して、フィールド値、範囲、地理的位置、フィルター、ヒストグラム、または日付ヒストグラム別に結果をグループ化し、ネストクエリを実行することもできます。複雑なクエリに対して複数の集計操作を実行できます。
背景情報
次の表は、集計方法について説明しています。
方法 | 説明 |
最小値 | フィールドの最小値を返すために使用できる集計方法です。この方法は、SQLのMIN関数と同様に使用できます。 |
最大値 | フィールドの最大値を返すために使用できる集計方法です。この方法は、SQLのMAX関数と同様に使用できます。 |
合計 | 数値フィールドのすべての値の合計を返すために使用できる集計方法です。この方法は、SQLのSUM関数と同様に使用できます。 |
平均値 | 数値フィールドのすべての値の平均を返すために使用できる集計方法です。この方法は、SQLのAVG関数と同様に使用できます。 |
カウント | 特定のフィールドの値の総数、または検索インデックス内の行の総数を返すために使用できる集計方法です。この方法は、SQLのCOUNT関数と同様に使用できます。 |
個別カウント | フィールドの個別値の数を返すために使用できる集計方法です。この方法は、SQLのCOUNT(DISTINCT)関数と同様に使用できます。 |
フィールド値によるグループ化 | フィールド値に基づいてクエリ結果をグループ化するために使用できる集計方法です。同じ値は一緒にグループ化されます。各グループの同一値と、各グループ内の同一値の数が返されます。 説明 グループ内の値の数が非常に大きい場合、計算された数は実際の数と異なる場合があります。 |
複数フィールドによるグループ化 | 複数のフィールドに基づいてクエリ結果をグループ化するために使用できる集計方法です。トークンを使用してページングを実行できます。 |
範囲によるグループ化 | フィールドの値の範囲に基づいてクエリ結果をグループ化するために使用できる集計方法です。指定された範囲内のフィールド値は一緒にグループ化されます。各範囲内の値の数が返されます。 |
地理的位置によるグループ化 | 地理的位置から中心点までの距離に基づいてクエリ結果をグループ化するために使用できる集計方法です。指定された範囲内の距離のクエリ結果は一緒にグループ化されます。各範囲内の項目数が返されます。 |
フィルターによるグループ化 | クエリ結果をフィルタリングし、各フィルターに基づいてグループ化して、一致する結果の数を取得するために使用できる集計方法です。結果は、フィルターが指定された順序で返されます。 |
ヒストグラムによるクエリ | 特定のデータ間隔に基づいてクエリ結果をグループ化するために使用できる集計方法です。同じ範囲内のフィールド値は一緒にグループ化されます。各グループの値の範囲と、各グループ内の値の数が返されます。 |
日付ヒストグラムによるクエリ | 特定の日付間隔に基づいてクエリ結果をグループ化するために使用できる集計方法です。同じ範囲内のフィールド値は一緒にグループ化されます。各グループの値の範囲と、各グループ内の値の数が返されます。 |
ネスト | GroupByはネストをサポートしています。GroupByを使用してサブ集計操作を実行できます。 |
複数集計 | 複数の集計操作を実行できます。 説明 複数の複雑な集計操作を同時に実行すると、長時間を要する場合があります。 |
前提条件
OTSClientインスタンスが初期化されていること。詳細については、OTSClientインスタンスの初期化を参照してください。
データテーブルが作成され、データがデータテーブルに書き込まれていること。詳細については、データテーブルの作成とデータの書き込みを参照してください。
データテーブルの検索インデックスが作成されていること。詳細については、検索インデックスの作成を参照してください。
最小値
フィールドの最小値を返すために使用できる集計方法です。この方法は、SQLのMIN関数と同様に使用できます。
パラメーター
パラメーター
説明
Name
集計操作の一意の名前です。この名前を使用して、特定の集計操作の結果をクエリできます。
FieldName
集計操作を実行するために使用されるフィールドの名前です。LONG、DOUBLE、およびDATEデータ型のみがサポートされています。
Missing
フィールド値が空の行で集計操作が実行されるフィールドのデフォルト値です。
Missingに値を指定しない場合、行は無視されます。
Missingに値を指定した場合、このパラメーターの値が行のフィールド値として使用されます。
例
/** * 各製品の価格は製品テーブルに記載されています。浙江省で生産された製品の最低価格をクエリします。 * 同等のSQLステートメント:SELECT min(column_price) FROM product where place_of_production="Zhejiang"; */ func min(client *tablestore.TableStoreClient, tableName string, indexName string) { searchRequest := &tablestore.SearchRequest{} searchRequest. SetTableName(tableName). // データテーブルの名前を指定します。 SetIndexName(indexName). // 検索インデックスの名前を指定します。 SetSearchQuery(search.NewSearchQuery(). SetQuery(&search.TermQuery{"place_of_production", "Zhejiang"}). SetLimit(0). // 特定のデータではなく集計結果のみを取得する場合、limitを0に設定してクエリのパフォーマンスを向上させることができます。 Aggregation(search.NewMinAggregation("min_agg_1", "column_price").Missing(0.00))) searchResponse, err := client.Search(searchRequest) // ステートメントを実行します。 aggResults := searchResponse.AggregationResults // 集計結果を取得します。 agg1, err := aggResults.Min("min_agg_1") // min_agg_1という名前の集計操作の結果を取得します。 if err != nil { panic(err) } if agg1.HasValue() { // min_agg_1という名前の集計操作の結果に値が含まれているかどうかを確認します。 fmt.Println(agg1.Value) // 集計結果を表示します。 } }
最大値
フィールドの最大値を返すために使用できる集計方法です。この方法は、SQLのMAX関数と同様に使用できます。
パラメーター
パラメーター
説明
Name
集計操作の一意の名前です。この名前を使用して、特定の集計操作の結果をクエリできます。
FieldName
集計操作を実行するために使用されるフィールドの名前です。LONG、DOUBLE、およびDATEデータ型のみがサポートされています。
Missing
フィールド値が空の行で集計操作が実行されるフィールドのデフォルト値です。
Missingに値を指定しない場合、行は無視されます。
Missingに値を指定した場合、このパラメーターの値が行のフィールド値として使用されます。
例
/** * 各製品の価格は製品テーブルに記載されています。浙江省で生産された製品の最高価格をクエリします。 * 同等のSQLステートメント:SELECT max(column_price) FROM product where place_of_production = "Zhejiang Province". */ func max(client *tablestore.TableStoreClient, tableName string, indexName string) { searchRequest := &tablestore.SearchRequest{} searchRequest. SetTableName(tableName). // データテーブルの名前を指定します。 SetIndexName(indexName). // 検索インデックスの名前を指定します。 SetSearchQuery(search.NewSearchQuery(). SetQuery(&search.TermQuery{"place_of_production", "Zhejiang"}). SetLimit(0). // 特定のデータではなく集計結果のみを取得する場合、limitを0に設定してクエリのパフォーマンスを向上させることができます。 Aggregation(search.NewMaxAggregation("max_agg_1", "column_price").Missing(0.00))) searchResponse, err := client.Search(searchRequest) // ステートメントを実行します。 aggResults := searchResponse.AggregationResults // 集計結果を取得します。 agg1, err := aggResults.Max("max_agg_1") // max_agg_1という名前の集計操作の結果を取得します。 if err != nil { panic(err) } if agg1.HasValue() { // max_agg_1という名前の集計操作の結果に値が含まれているかどうかを確認します。 fmt.Println(agg1.Value) // 集計結果を表示します。 } }
合計
数値フィールドのすべての値の合計を返すために使用できる集計方法です。この方法は、SQLのSUM関数と同様に使用できます。
パラメーター
パラメーター
説明
Name
集計操作の一意の名前です。この名前を使用して、特定の集計操作の結果をクエリできます。
FieldName
集計操作を実行するために使用されるフィールドの名前です。LONGおよびDOUBLEデータ型のみがサポートされています。
Missing
フィールド値が空の行に適用される、集計操作が実行されるフィールドのデフォルト値です。
Missingに値を指定しない場合、行は無視されます。
Missingに値を指定した場合、このパラメーターの値が行のフィールド値として使用されます。
例
/** * 各製品の売上高は製品テーブルに記載されています。浙江省で生産された販売済み製品の総数をクエリします。製品の売上が空の場合、デフォルト値として10が使用されます。 * 同等のSQLステートメント:SELECT sum(column_price) FROM product where place_of_production = "Zhejiang". */ func sum(client *tablestore.TableStoreClient, tableName string, indexName string) { searchRequest := &tablestore.SearchRequest{} searchRequest. SetTableName(tableName). // データテーブルの名前を指定します。 SetIndexName(indexName). // 検索インデックスの名前を指定します。 SetSearchQuery(search.NewSearchQuery(). SetQuery(&search.TermQuery{"place_of_production", "Zhejiang"}). SetLimit(0). // 特定のデータではなく集計結果のみを取得する場合、limitを0に設定してクエリのパフォーマンスを向上させることができます。 Aggregation(search.NewSumAggregation("sum_agg_1", "column_price").Missing(0.00))) searchResponse, err := client.Search(searchRequest) // ステートメントを実行します。 aggResults := searchResponse.AggregationResults // 集計結果を取得します。 agg1, err := aggResults.Sum("sum_agg_1") // sum_agg_1という名前の集計操作の結果を取得します。 if err != nil { panic(err) } fmt.Println(agg1.Value) // 集計結果を表示します。 }
平均値
数値フィールドのすべての値の平均を返すために使用できる集計方法です。この方法は、SQLのAVG関数と同様に使用できます。
パラメーター
パラメーター
説明
Name
集計操作の一意の名前です。この名前を使用して、特定の集計操作の結果をクエリできます。
FieldName
集計操作を実行するために使用されるフィールドの名前です。LONG、DOUBLE、およびDATEデータ型のみがサポートされています。
Missing
フィールド値が空の行で集計操作が実行されるフィールドのデフォルト値です。
Missingに値を指定しない場合、行は無視されます。
Missingに値を指定した場合、このパラメーターの値が行のフィールド値として使用されます。
例
/** * 各製品の売上高は製品テーブルに記載されています。浙江省で生産された製品の平均価格をクエリします。 * 同等のSQLステートメント:SELECT avg(column_price) FROM product where place_of_production = "Zhejiang Province". */ func avg(client *tablestore.TableStoreClient, tableName string, indexName string) { searchRequest := &tablestore.SearchRequest{} searchRequest. SetTableName(tableName). // データテーブルの名前を指定します。 SetIndexName(indexName). // 検索インデックスの名前を指定します。 SetSearchQuery(search.NewSearchQuery(). SetQuery(&search.TermQuery{"place_of_production", "Zhejiang"}). SetLimit(0). // 特定のデータではなく集計結果のみを取得する場合、limitを0に設定してクエリのパフォーマンスを向上させることができます。 Aggregation(search.NewAvgAggregation("avg_agg_1", "column_price").Missing(0.00))) searchResponse, err := client.Search(searchRequest) // ステートメントを実行します。 aggResults := searchResponse.AggregationResults // 集計結果を取得します。 agg1, err := aggResults.Avg("avg_agg_1") // avg_agg_1という名前の集計操作の結果を取得します。 if err != nil { panic(err) } if agg1.HasValue() { // agg1という名前の集計操作の結果に値が含まれているかどうかを確認します。 fmt.Println(agg1.Value) // 集計結果を表示します。 } }
カウント
特定のフィールドの値の総数、または検索インデックス内の行の総数を返すために使用できる集計方法です。この方法は、SQLのCOUNT関数と同様に使用できます。
次の方法を使用して、検索インデックス内の行の総数、またはクエリ条件を満たす行の総数をクエリできます。
集計のカウント機能を使用し、リクエストでcount(*)を指定します。
クエリ機能を使用して、クエリ条件を満たす行の数を取得します。クエリでsetGetTotalCountをtrueに設定します。MatchAllQueryを使用して、検索インデックス内の行の総数を取得します。
列の名前をcount式の値として使用して、検索インデックスに列が含まれる行の数をクエリできます。この方法は、スパース列を含むシナリオに適しています。
パラメーター
パラメーター
説明
Name
集計操作の一意の名前です。この名前を使用して、特定の集計操作の結果をクエリできます。
FieldName
集計操作を実行するために使用されるフィールドの名前です。サポートされているデータ型は、LONG、DOUBLE、BOOLEAN、KEYWORD、GEO_POINT、およびDATEのみです。
例
/** * 加盟店のペナルティ記録は加盟店テーブルに記録されます。浙江省に所在し、ペナルティ記録が存在する加盟店の数をクエリできます。加盟店のペナルティ記録が存在しない場合、ペナルティ記録に対応するフィールドも加盟店には存在しません。 * 同等のSQLステートメント:SELECT count(column_history) FROM product where place_of_production = "Zhejiang Province". */ func count(client *tablestore.TableStoreClient, tableName string, indexName string) { searchRequest := &tablestore.SearchRequest{} searchRequest. SetTableName(tableName). // データテーブルの名前を指定します。 SetIndexName(indexName). // 検索インデックスの名前を指定します。 SetSearchQuery(search.NewSearchQuery(). SetQuery(&search.TermQuery{"place_of_production", "Zhejiang"}). SetLimit(0). // 特定のデータではなく集計結果のみを取得する場合、limitを0に設定してクエリのパフォーマンスを向上させることができます。 Aggregation(search.NewCountAggregation("count_agg_1", "column_price"))) searchResponse, err := client.Search(searchRequest) // ステートメントを実行します。 aggResults := searchResponse.AggregationResults // 集計結果を取得します。 agg1, err := aggResults.Count("count_agg_1") // count_agg_1という名前の集計操作の結果を取得します。 if err != nil { panic(err) } fmt.Println(agg1.Value) // 集計結果を表示します。 }
個別カウント
フィールドの個別値の数を返すために使用できる集計方法です。この方法は、SQLのCOUNT(DISTINCT)関数と同様に使用できます。
個別値の数は概算です。
個別カウント機能を使用する前の行の総数が10,000未満の場合、計算結果は正確な値に近くなります。
個別カウント機能を使用する前の行の総数が1億以上の場合、エラー率は約2%です。
パラメーター
パラメーター
説明
Name
集計操作の一意の名前です。この名前を使用して、特定の集計操作の結果をクエリできます。
FieldName
集計操作を実行するために使用されるフィールドの名前です。サポートされているデータ型は、LONG、DOUBLE、BOOLEAN、KEYWORD、GEO_POINT、およびDATEのみです。
Missing
フィールド値が空の行に適用される、集計操作が実行されるフィールドのデフォルト値です。
Missingに値を指定しない場合、行は無視されます。
Missingに値を指定した場合、このパラメーターの値が行のフィールド値として使用されます。
例
/** * 製品が生産された異なる省の数をクエリします。 * 同等のSQLステートメント:SELECT count(distinct column_place) FROM product. */ func distinctCount(client *tablestore.TableStoreClient, tableName string, indexName string) { searchRequest := &tablestore.SearchRequest{} searchRequest. SetTableName(tableName). // データテーブルの名前を指定します。 SetIndexName(indexName). // 検索インデックスの名前を指定します。 SetSearchQuery(search.NewSearchQuery(). SetQuery(&search.TermQuery{"place_of_production", "Zhejiang"}). SetLimit(0). // 特定のデータではなく集計結果のみを取得する場合、limitを0に設定してクエリのパフォーマンスを向上させることができます。 Aggregation(search.NewDistinctCountAggregation("distinct_count_agg_1", "column_price").Missing(0.00))) searchResponse, err := client.Search(searchRequest) // ステートメントを実行します。 aggResults := searchResponse.AggregationResults // 集計結果を取得します。 agg1, err := aggResults.DistinctCount("distinct_count_agg_1") // distinct_count_agg_1という名前の集計操作の結果を取得します。 if err != nil { panic(err) } fmt.Println(agg1.Value) // 集計結果を表示します。 }
フィールド値によるグループ化
フィールド値に基づいてクエリ結果をグループ化するために使用できる集計方法です。同じ値は一緒にグループ化されます。各グループの同一値と、各グループ内の同一値の数が返されます。
グループ内の値の数が非常に大きい場合、計算された数は実際の数と異なる場合があります。
パラメーター
パラメーター
説明
Name
集計操作の一意の名前です。この名前を使用して、特定の集計操作の結果をクエリできます。
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です。
例
/** * 各カテゴリの製品数、および製品の最高価格と最低価格をクエリします。 * 返される結果の例:果物:5。価格の最大値は15、最小値は3です。トイレタリー:10。価格の最大値は98、最小値は1です。電子機器:3。価格の最大値は8699、最小値は2300です。 * その他の製品:15。価格の最大値は1000、最小値は80です。 */ func GroupByField(client *tablestore.TableStoreClient, tableName string, indexName string) { searchRequest := &tablestore.SearchRequest{} searchRequest. SetTableName(tableName). // データテーブルの名前を指定します。 SetIndexName(indexName). // 検索インデックスの名前を指定します。 SetSearchQuery(search.NewSearchQuery(). SetQuery(&search.MatchAllQuery{}). // すべての行に一致します。 SetLimit(0). GroupBy(search.NewGroupByField("group1", "column_type"). // カテゴリ別に製品をグループ化します。 SubAggregation(search.NewMinAggregation("min_price", "column_price")). // 各カテゴリの最低価格をクエリします。 SubAggregation(search.NewMaxAggregation("max_price", "column_price")))) // 各カテゴリの最高価格をクエリします。 searchResponse, err := client.Search(searchRequest) if err != nil { fmt.Printf("%#v", err) return } groupByResults := searchResponse.GroupByResults // 集計結果を取得します。 group, err := groupByResults.GroupByField("group1") if err != nil { fmt.Printf("%#v", err) return } for _, item := range group.Items { // 返されたグループをトラバースします。 // 各グループの値と各グループ内の行数を表示します。 fmt.Println("\tkey: ", item.Key, ", rowCount: ", item.RowCount) // 最低価格を表示します。 minPrice, _ := item.SubAggregations.Min("min_price") if minPrice.HasValue() { fmt.Println("\t\tmin_price: ", minPrice.Value) } // 最高価格を表示します。 maxPrice, _ := item.SubAggregations.Max("max_price") if maxPrice.HasValue() { fmt.Println("\t\tmax_price: ", maxPrice.Value) } } }
複数フィールドによるグループ化
複数のフィールドに基づいてクエリ結果をグループ化するために使用できる集計方法です。トークンを使用してページングを実行できます。
複数のフィールドに基づいてクエリ結果をグループ化する場合、ネストモードでgroupByパラメーターを使用するか、GroupByCompositeパラメーターを使用できます。groupByパラメーターとGroupByCompositeパラメーターの違いについては、付録:複数フィールドグループ化の異なる方法を参照してください。
パラメーター
パラメーター
説明
GroupByName
集計操作の一意の名前です。この名前を使用して、特定の集計操作の結果をクエリできます。
SourceGroupByList
クエリ結果をグループ化するフィールドです。最大32個のフィールドでクエリ結果をグループ化し、結果のグループに対して集計操作を実行できます。次のグループタイプがサポートされています。
重要SourceGroupByListパラメーターで指定されたグループタイプの場合、GroupBySorterパラメーターをgroupKeySortのみに設定できます。
デフォルトでは、グループは降順に並べ替えられます。
列にフィールド値が存在しない場合、システムはNULLを返します。
GroupByFieldタイプの場合、設定できるパラメーターはGroupByName、FieldName、およびGroupBySorterのみです。
GroupByHistogramタイプの場合、設定できるパラメーターはGroupByName、FieldName、Interval、およびGroupBySorterのみです。
GroupByDateHistogramタイプの場合、設定できるパラメーターはGroupByName、FieldName、Interval、TimeZone、およびGroupBySorterのみです。
NextToken
新しいページのグループを取得するために次のリクエストで使用されるページングトークンです。NextTokenパラメーターの値は、GroupByCompositeResult操作の出力から取得できます。NextTokenパラメーターを使用すると、すべてのグループ化結果を取得できます。
Size
ページあたりのグループ数です。要件を満たすグループの数がSizeパラメーターの値を超える場合、NextTokenパラメーターを使用して次のページのグループを取得する必要があります。
重要返されるグループの数を制限する場合、SizeパラメーターとSuggestedSizeパラメーターを同時に設定することはできません。ほとんどの場合、Sizeパラメーターを設定することをお勧めします。
TablestoreをApache SparkやPrestoSQLなどの高スループットコンピューティングエンジンと相互接続する場合、SuggestedSizeパラメーターを設定することをお勧めします。
SuggestedSize
ページあたりのグループの予想数です。サーバー側で許可されるグループの最大数より大きい値または-1を設定できます。サーバー側は、その容量に基づいてグループの実際の数を返します。このパラメーターは、TablestoreをApache SparkやPrestoSQLなどの高スループットコンピューティングエンジンと相互接続するシナリオに適用できます。
このパラメーターをサーバー側で許可されるグループの最大数より大きい値に設定すると、システムは値をサーバー側で許可されるグループの最大数に調整します。返されるグループの実際の数は、
min(suggestedSize, サーバー側で許可されるグループの最大数, グループの総数)
です。SubAggList and SubGroupByList
サブ集計操作です。グループ化結果に基づいてサブ集計操作を実行できます。
重要GroupByCompositeタイプは、SubGroupByListパラメーターではサポートされていません。
例
/** * クエリ結果のグループ化と集計:クエリ結果をグループ化し、SourceGroupByパラメーターに渡されたgroupbyField、groupByHistogram、groupByDataHistogramなどのパラメーターに基づいて集計操作を実行します。 * 複数フィールドの集計結果をフラット構造で返します。 */ func groupByComposite(client *tablestore.TableStoreClient, tableName string, indexName string) { searchRequest := &tablestore.SearchRequest{} searchRequest. request.setTableName(tableName); // データテーブルの名前を指定します。 request.setIndexName(indexName); // 検索インデックスの名前を指定します。 SetSearchQuery(search.NewSearchQuery(). SetQuery(&search.MatchAllQuery{}). // すべての行に一致します。 SetLimit(0). GroupBy(search.NewGroupByComposite("groupByComposite"). SourceGroupBys(search.NewGroupByField("groupByField_1", "Col_Long"), search.NewGroupByField("groupByField_2", "Col_Keyword"), search.NewGroupByField("groupByField_3", "Col_Double")). SetSize(10))) searchResponse, err := client.Search(searchRequest) if err != nil { fmt.Printf("%#v", err) return } groupByResults := searchResponse.GroupByResults // 集計結果を取得します。 group, err := groupByResults.GroupByComposite("group1") if err != nil { fmt.Printf("%#v", err) return } fmt.Println("groupName: ", group.Name) for _, item := range group.Items { // 返されたグループをトラバースします。 // 各グループの値と各グループ内の行数を表示します。 fmt.Printf("\tkey:") if item.Keys != nil { for i := 0; i < len(item.Keys); i++ { fmt.Printf(" %v ", *item.Keys[i]) } fmt.Printf("\trowCount:%v\n", item.RowCount) } } }
範囲によるグループ化
フィールドの値の範囲に基づいてクエリ結果をグループ化するために使用できる集計方法です。指定された範囲内のフィールド値は一緒にグループ化されます。各範囲内の値の数が返されます。
パラメーター
パラメーター
説明
Name
集計操作の一意の名前です。この名前を使用して、特定の集計操作の結果をクエリできます。
FieldName
集計操作を実行するために使用されるフィールドの名前です。LONGおよびDOUBLEデータ型のみがサポートされています。
Range(fromInclusive float64, toExclusive float64)
グループ化に使用される値の範囲です。
範囲はNegInfから開始し、Infで終了できます。
SubAggregation and SubGroupBy
サブ集計操作です。グループ化結果に基づいてサブ集計操作を実行できます。
たとえば、売上高と県別にクエリ結果をグループ化した後、指定された範囲内で売上高の割合が最も大きい県を取得できます。これを行うには、GroupByRangeでGroupByFieldを指定する必要があります。
例
/** * 売上数量を範囲[NegInf, 1000)、[1000, 5000)、および[5000, Inf)に基づいてグループ化して、各範囲の売上数量を取得します。 */ func GroupByRange(client *tablestore.TableStoreClient, tableName string, indexName string) { searchRequest := &tablestore.SearchRequest{} searchRequest. SetTableName(tableName). // データテーブルの名前を指定します。 SetIndexName(indexName). // 検索インデックスの名前を指定します。 SetSearchQuery(search.NewSearchQuery(). SetQuery(&search.MatchAllQuery{}). // すべての行に一致します。 SetLimit(0). GroupBy(search.NewGroupByRange("group1", "column_number"). Range(search.NegInf, 1000). Range(1000, 5000). Range(5000, search.Inf))) searchResponse, err := client.Search(searchRequest) if err != nil { fmt.Printf("%#v", err) return } groupByResults := searchResponse.GroupByResults // 集計結果を取得します。 group, err := groupByResults.GroupByRange("group1") if err != nil { fmt.Printf("%#v", err) return } for _, item := range group.Items { // 返されたグループをトラバースします。 fmt.Println("\t[", item.From, ", ", item.To, "), rowCount: ", item.RowCount) // 各グループの行数を表示します。 } }
地理的位置によるグループ化
地理的位置から中心点までの距離に基づいてクエリ結果をグループ化するために使用できる集計方法です。指定された範囲内の距離のクエリ結果は一緒にグループ化されます。各範囲内の項目数が返されます。
パラメーター
パラメーター
説明
Name
集計操作の一意の名前です。この名前を使用して、特定の集計操作の結果をクエリできます。
FieldName
集計操作に使用されるフィールドの名前です。GEO_POINTデータ型のみがサポートされています。
CenterPoint(latitude float64, longitude float64)
中心点の経度と緯度です。
latitudeは中心点の緯度を指定します。longitudeは中心点の経度を指定します。
Range(fromInclusive float64, toExclusive float64)
グループ化に使用される距離範囲です。単位:メートル。
範囲はNegInfから開始し、Infで終了できます。
SubAggregation and SubGroupBy
サブ集計操作です。グループ化結果に基づいてサブ集計操作を実行できます。
例
/** * ユーザーを地理的位置から万達広場までの距離に基づいてグループ化して、各距離範囲内のユーザー数を取得します。距離範囲は[NegInf, 1000)、[1000, 5000)、および[5000, Inf)です。単位:メートル。 */ func GroupByGeoDistance(client *tablestore.TableStoreClient, tableName string, indexName string) { searchRequest := &tablestore.SearchRequest{} searchRequest. SetTableName(tableName). // データテーブルの名前を指定します。 SetIndexName(indexName). // 検索インデックスの名前を指定します。 SetSearchQuery(search.NewSearchQuery(). SetQuery(&search.MatchAllQuery{}). // すべての行に一致します。 SetLimit(0). GroupBy(search.NewGroupByGeoDistance("group1", "Col_GeoPoint", search.GeoPoint{Lat: 30.137817, Lon:120.08681}). Range(search.NegInf, 1000). Range(1000, 5000). Range(5000, search.Inf))) searchResponse, err := client.Search(searchRequest) if err != nil { fmt.Printf("%#v", err) return } groupByResults := searchResponse.GroupByResults // 集計結果を取得します。 group, err := groupByResults.GroupByGeoDistance("group1") if err != nil { fmt.Printf("%#v", err) return } for _, item := range group.Items { // 返されたグループをトラバースします。 fmt.Println("\t[", item.From, ", ", item.To, "), rowCount: ", item.RowCount) // 各グループの行数を表示します。 } }
フィルターによるグループ化
クエリ結果をフィルタリングし、各フィルターに基づいてグループ化して、一致する結果の数を取得するために使用できる集計方法です。結果は、フィルターが指定された順序で返されます。
パラメーター
パラメーター
説明
Name
集計操作の一意の名前です。この名前を使用して、特定の集計操作の結果をクエリできます。
Query
クエリに使用できるフィルターです。結果は、フィルター条件が指定された順序で返されます。
SubAggregation and SubGroupBy
サブ集計操作です。グループ化結果に基づいてサブ集計操作を実行できます。
例
/** * 次のフィルターを指定して、各フィルターに一致する項目の数を取得します。売上高が100を超えている、原産地が浙江省である、説明に杭州が含まれている。 */ func GroupByFilter(client *tablestore.TableStoreClient, tableName string, indexName string) { searchRequest := &tablestore.SearchRequest{} searchRequest. SetTableName(tableName). // データテーブルの名前を指定します。 SetIndexName(indexName). // 検索インデックスの名前を指定します。 SetSearchQuery(search.NewSearchQuery(). SetQuery(&search.MatchAllQuery{}). // すべての行に一致します。 SetLimit(0). GroupBy(search.NewGroupByFilter("group1"). Query(&search.RangeQuery{ FieldName: "number", From: 100, IncludeLower: true}). Query(&search.TermQuery{ FieldName: "place", Term: "Zhejiang", }). Query(&search.MatchQuery{ FieldName: "description", Text: "Hangzhou", }))) searchResponse, err := client.Search(searchRequest) if err != nil { fmt.Printf("%#v", err) return } groupByResults := searchResponse.GroupByResults // 集計結果を取得します。 group, err := groupByResults.GroupByFilter("group1") if err != nil { fmt.Printf("%#v", err) return } for _, item := range group.Items { // 返されたグループをトラバースします。 fmt.Println("\trowCount: ", item.RowCount) // 各グループの行数を表示します。 } }
ヒストグラムによるグループ化
特定のデータ間隔に基づいてクエリ結果をグループ化するために使用できる集計方法です。同じ範囲内のフィールド値は一緒にグループ化されます。各グループの値の範囲と、各グループ内の値の数が返されます。
パラメーター
パラメーター
説明
GroupByName
集計操作の一意の名前です。この名前を使用して、特定の集計操作の結果をクエリできます。
Field
集計操作を実行するために使用されるフィールドの名前です。LONGおよびDOUBLEデータ型のみがサポートされています。
Interval
集計結果を取得するために使用される日付間隔です。
FieldRange[min,max]
Intervalパラメーターと共に使用してグループの数を制限する範囲です。
(FieldRange.max-FieldRange.min)/interval
式を使用して計算された値は2000を超えることはできません。MinDocCount
行の最小数です。グループ内の行数が行の最小数より少ない場合、そのグループの集計結果は返されません。
Missing
フィールド値が空の行に適用される、集計操作が実行されるフィールドのデフォルト値です。
Missingに値を指定しない場合、行は無視されます。
Missingに値を指定した場合、このパラメーターの値が行のフィールド値として使用されます。
例
func GroupByHistogram(client *tablestore.TableStoreClient, tableName string, indexName string) { searchRequest := &tablestore.SearchRequest{} searchRequest. request.setTableName(tableName); // データテーブルの名前を指定します。 request.setIndexName(indexName); // 検索インデックスの名前を指定します。 SetSearchQuery(search.NewSearchQuery(). SetQuery(&search.MatchAllQuery{}). // すべての行に一致します。 SetLimit(0). GroupBy(search.NewGroupByHistogram("group1", "field_name"). SetMinDocCount(1). SetFiledRange(1, 100). SetMissing(3). SetInterval(10))) searchResponse, err := client.Search(searchRequest) if err != nil { fmt.Printf("%#v", err) return } groupByResults := searchResponse.GroupByResults // 集計結果を取得します。 group, err := groupByResults.GroupByHistogram("group1") if err != nil { fmt.Printf("%#v", err) return } for _, item := range group.Items { // 返されたグループをトラバースします。 fmt.Println("key:", item.Key.Value, ", rowCount:", item.Value) } }
日付ヒストグラムによるグループ化
特定の日付間隔に基づいてクエリ結果をグループ化するために使用できる集計方法です。同じ範囲内のフィールド値は一緒にグループ化されます。各グループの値の範囲と、各グループ内の値の数が返されます。
パラメーター
パラメーター
説明
GroupByName
集計操作の一意の名前です。この名前を使用して、特定の集計操作の結果をクエリできます。
Field
集計操作を実行するために使用されるフィールドの名前です。DATEデータ型のみがサポートされています。
Interval
集計結果を取得するために使用される日付間隔です。
FieldRange[min,max]
Intervalパラメーターと共に使用してグループの数を制限する範囲です。
(FieldRange.max-FieldRange.min)/interval
式を使用して計算された値は2000を超えることはできません。MinDocCount
行の最小数です。グループ内の行数が行の最小数より少ない場合、そのグループの集計結果は返されません。
Missing
フィールド値が空の行に適用される、集計操作が実行されるフィールドのデフォルト値です。
Missingに値を指定しない場合、行は無視されます。
Missingに値を指定した場合、このパラメーターの値が行のフィールド値として使用されます。
TimeZone
+hh:mm
または-hh:mm
形式(例:+08:00
または-09:00
)のタイムゾーンです。このパラメーターは、フィールドがDATEデータ型の場合にのみ必須です。DATEデータ型のフィールドにこのパラメーターを指定しない場合、集計結果にN時間のオフセットが発生する可能性があります。このパラメーターを指定することで、このエラーを解決できます。
例
func GroupByDateHistogram(client *tablestore.TableStoreClient, tableName string, indexName string) { searchRequest := &tablestore.SearchRequest{} searchRequest. request.setTableName(tableName); // データテーブルの名前を指定します。 request.setIndexName(indexName); // 検索インデックスの名前を指定します。 SetSearchQuery(search.NewSearchQuery(). SetQuery(&search.MatchAllQuery{}). // すべての行に一致します。 SetLimit(0). GroupBy(search.NewGroupByDateHistogram("date_group", "date_field_name"). SetMinDocCount(1). SetFiledRange("2017-05-01 10:00", "2017-05-21 13:00:00"). SetMissing("2017-05-01 13:01:00"). SetInterval(model.DateTimeValue{ Value: proto.Int32(1), Unit: model.DateTimeUnit_DAY.Enum(), }))) searchResponse, err := client.Search(searchRequest) if err != nil { fmt.Printf("%#v", err) return } groupByResults := searchResponse.GroupByResults // 集計結果を取得します。 group, err := groupByResults.GroupByDateHistogram("date_group") if err != nil { fmt.Printf("%#v", err) return } for _, item := range group.Items { // 返されたグループをトラバースします。 fmt.Printf("millisecondTimestamp:%d , rowCount:%d \n", item.Timestamp, item.RowCount) } }
ネスト
GroupByはネストをサポートしています。GroupByを使用してサブ集計操作を実行できます。
ネストを使用して、グループ内でサブ集計操作を実行できます。次の例は、2レベルのネストを使用した集計操作を示しています。
GroupBy + SubGroupBy:項目は県と市でグループ化され、各県の各市のデータが取得されます。
GroupBy + SubAggregation:項目は県でグループ化され、各県の指標の最大値が取得されます。
複雑なGroupBy操作の高パフォーマンスを確保するために、ネストのレベル数を少なく指定できます。詳細については、検索インデックスの制限を参照してください。
例
/**
* ネストベースの集計を実行します。
* GroupByFieldの最外レベルでは、2つの集計と1つのGroupByRange属性が指定されています。
*/
func NestedSample(client *tablestore.TableStoreClient, tableName string, indexName string) {
searchRequest := &tablestore.SearchRequest{}
searchRequest.
SetTableName(tableName). // データテーブルの名前を指定します。
SetIndexName(indexName). // 検索インデックスの名前を指定します。
SetSearchQuery(search.NewSearchQuery().
SetQuery(&search.MatchAllQuery{}). // すべての行に一致します。
SetLimit(0).
GroupBy(search.NewGroupByField("group1", "field1").
SubAggregation(search.NewMinAggregation("sub_agg1", "sub_field1")).
SubAggregation(search.NewMaxAggregation("sub_agg2", "sub_field2")).
SubGroupBy(search.NewGroupByRange("sub_group1", "sub_field3").
Range(search.NegInf, 3).
Range(3, 5).
Range(5, search.Inf))))
searchResponse, err := client.Search(searchRequest)
if err != nil {
fmt.Printf("%#v", err)
return
}
groupByResults := searchResponse.GroupByResults // 集計結果を取得します。
group, err := groupByResults.GroupByField("group1")
if err != nil {
fmt.Printf("%#v", err)
return
}
for _, item := range group.Items { // 返されたグループをトラバースします。
// 各グループの値と各グループ内の行数を表示します。
fmt.Println("\tkey: ", item.Key, ", rowCount: ", item.RowCount)
// sub_agg1という名前の集計操作の結果を取得します。
subAgg1, _ := item.SubAggregations.Min("sub_agg1")
if subAgg1.HasValue() {
fmt.Println("\t\tsub_agg1: ", subAgg1.Value)
}
// sub_agg2という名前の集計操作の結果を取得します。
subAgg2, _ := item.SubAggregations.Max("sub_agg2")
if subAgg2.HasValue() {
fmt.Println("\t\tsub_agg2: ", subAgg2.Value)
}
// sub_group1という名前の集計操作の結果を取得します。
subGroup, _ := item.SubGroupBys.GroupByRange("sub_group1")
for _, item := range subGroup.Items {
fmt.Println("\t\t[", item.From, ", ", item.To, "), rowCount: ", item.RowCount)
}
}
}
複数集計
複数の集計操作を実行できます。
複数の複雑な集計操作を同時に実行すると、長時間を要する場合があります。
例 1
func MultipleAggregations(client *tablestore.TableStoreClient, tableName string, indexName string) { searchRequest := &tablestore.SearchRequest{} searchRequest. SetTableName(tableName). // データテーブルの名前を指定します。 SetIndexName(indexName). // 検索インデックスの名前を指定します。 SetSearchQuery(search.NewSearchQuery(). SetQuery(&search.MatchAllQuery{}). // すべての行に一致します。 SetLimit(0). Aggregation(search.NewAvgAggregation("agg1", "Col_Long")). // Col_Longフィールドの平均値を計算します。 Aggregation(search.NewDistinctCountAggregation("agg2", "Col_Long")). // Col_Longフィールドの個別値の数を計算します。 Aggregation(search.NewMaxAggregation("agg3", "Col_Long")). // Col_Longフィールドの最大値をクエリします。 Aggregation(search.NewSumAggregation("agg4", "Col_Long")). // Col_Longフィールドの値の合計を計算します。 Aggregation(search.NewCountAggregation("agg5", "Col_Long"))) // Col_Longフィールドを含む行数を計算します。 // すべての列を返します。 searchRequest.SetColumnsToGet(&tablestore.ColumnsToGet{ ReturnAll: true, }) searchResponse, err := client.Search(searchRequest) if err != nil { fmt.Printf("%#v", err) return } aggResults := searchResponse.AggregationResults // 集計結果を取得します。 // 集計操作から取得された平均値を取得します。 agg1, err := aggResults.Avg("agg1") // agg1という名前の集計操作の結果を取得します。 if err != nil { panic(err) } if agg1.HasValue() { // agg1という名前の集計操作の結果に値が含まれているかどうかを確認します。 fmt.Println("(avg) agg1: ", agg1.Value) // Col_Longフィールドの平均値を表示します。 } else { fmt.Println("(avg) agg1: no value") // Col_Longフィールドに値が含まれていない行を表示します。 } // 集計操作の結果から個別値の数を取得します。 agg2, err := aggResults.DistinctCount("agg2") // agg2という名前の集計操作の結果を取得します。 if err != nil { panic(err) } fmt.Println("(distinct) agg2: ", agg2.Value) // Col_Longフィールドの個別値の数を表示します。 // 集計操作から取得された最大値を表示します。 agg3, err := aggResults.Max("agg3") // agg3という名前の集計操作の結果を取得します。 if err != nil { panic(err) } if agg3.HasValue() { fmt.Println("(max) agg3: ", agg3.Value) // Col_Longフィールドの最大値を表示します。 } else { fmt.Println("(max) agg3: no value") // Col_Longフィールドに値が含まれていない行を表示します。 } // 集計操作の結果から合計を取得します。 agg4, err := aggResults.Sum("agg4") // agg4という名前の集計操作の結果を取得します。 if err != nil { panic(err) } fmt.Println("(sum) agg4: ", agg4.Value) // Col_Longフィールドの合計を表示します。 // 集計操作の結果から行数を取得します。 agg5, err := aggResults.Count("agg5") // agg5という名前の集計操作の結果を取得します。 if err != nil { panic(err) } fmt.Println("(count) agg6: ", agg5.Value) // Col_Longフィールドの値の数を表示します。 }
例 2
func MultipleAggregationsAndGroupBysSample(client *tablestore.TableStoreClient, tableName string, indexName string) { searchRequest := &tablestore.SearchRequest{} searchRequest. SetTableName(tableName). // データテーブルの名前を指定します。 SetIndexName(indexName). // 検索インデックスの名前を指定します。 SetSearchQuery(search.NewSearchQuery(). SetQuery(&search.MatchAllQuery{}). // すべての行に一致します。 SetLimit(0). Aggregation(search.NewAvgAggregation("agg1", "Col_Long")). // Col_Longフィールドの平均値を計算します。 Aggregation(search.NewDistinctCountAggregation("agg2", "Col_Long")). // Col_Longフィールドの個別値の数を計算します。 Aggregation(search.NewMaxAggregation("agg3", "Col_Long")). // Col_Longフィールドの最大値をクエリします。 GroupBy(search.NewGroupByField("group1", "Col_Keyword"). // Col_Keywordフィールドに基づいて、フィールド値でグループ化します。 GroupBySorters([]search.GroupBySorter{}). // 返されるグループの並べ替え方法を指定します。 Size(2). // 最初の2つのグループのみが返されるように指定します。 SubAggregation(search.NewAvgAggregation("sub_agg1", "Col_Long")). // 各グループに対してサブ集計操作を実行します。 SubGroupBy(search.NewGroupByField("sub_group1", "Col_Keyword2"))). // 各グループに対してサブ集計操作を実行します。 GroupBy(search.NewGroupByRange("group2", "Col_Long"). // Col_Longフィールドに基づいて、範囲でグループ化します。 Range(search.NegInf, 3). // 最初のグループには、Col_Longフィールドの値が(NegInf, 3)の範囲内にある行が含まれます。 Range(3, 5). // 2番目のグループには、Col_Longフィールドの値が[3, 5)の範囲内にある行が含まれます。 Range(5, search.Inf))) // 3番目のグループには、Col_Longフィールドの値が[5, Inf)の範囲内にある行が含まれます。 // すべての列を返します。 searchResponse, err := client.Search(searchRequest) if err != nil { fmt.Printf("%#v", err) return } aggResults := searchResponse.AggregationResults // 集計結果を取得します。 // 集計操作から取得された平均値を取得します。 agg1, err := aggResults.Avg("agg1") // agg1という名前の集計操作の結果を取得します。 if err != nil { panic(err) } if agg1.HasValue() { // agg1という名前の集計操作の結果に値が含まれているかどうかを確認します。 fmt.Println("(avg) agg1: ", agg1.Value) // Col_Longフィールドの平均値を表示します。 } else { fmt.Println("(avg) agg1: no value") // Col_Longフィールドに値が含まれていない行を表示します。 } // 集計操作の結果から個別値の数を取得します。 agg2, err := aggResults.DistinctCount("agg2") // agg2という名前の集計操作の結果を取得します。 if err != nil { panic(err) } fmt.Println("(distinct) agg2: ", agg2.Value) // Col_Longフィールドの個別値の数を表示します。 // 集計操作から取得された最大値を表示します。 agg3, err := aggResults.Max("agg3") // agg3という名前の集計操作の結果を取得します。 if err != nil { panic(err) } if agg3.HasValue() { fmt.Println("(max) agg3: ", agg3.Value) // Col_Longフィールドの最大値を表示します。 } else { fmt.Println("(max) agg3: no value") // Col_Longフィールドに値が含まれていない行を表示します。 } groupByResults := searchResponse.GroupByResults // 集計結果を取得します。 // GroupByField集計操作の結果を取得します。 group1, err := groupByResults.GroupByField("group1") // group1という名前の集計操作の結果を取得します。 if err != nil { panic(err) } fmt.Println("group1: ") for _, item := range group1.Items { // 返されたすべてのグループをトラバースします。 //item fmt.Println("\tkey: ", item.Key, ", rowCount: ", item.RowCount) // 各グループの行数を表示します。 // サブ集計操作から取得された平均値を取得します。 subAgg1, err := item.SubAggregations.Avg("sub_agg1") // sub_agg1という名前のサブ集計操作の結果を取得します。 if err != nil { panic(err) } if subAgg1.HasValue() { // sub_agg1がCol_Longフィールドの平均値を取得した場合、HasValue()はtrueに設定されます。 fmt.Println("\t\tsub_agg1: ", subAgg1.Value) // サブ集計操作から取得されたCol_Longフィールドの平均値を表示します。 } // GroupByFieldサブ集計操作の結果を取得します。 subGroup1, err := item.SubGroupBys.GroupByField("sub_group1") // sub_group1という名前のサブ集計操作の結果を取得します。 if err != nil { panic(err) } fmt.Println("\t\tsub_group1") for _, subItem := range subGroup1.Items { // sub_group1という名前のサブ集計操作の結果をトラバースします。 fmt.Println("\t\t\tkey: ", subItem.Key, ", rowCount: ", subItem.RowCount) // sub_group1という名前のサブ集計操作の結果から取得された各グループの行数を表示します。 tablestore.Assert(subItem.SubAggregations.Empty(), "") tablestore.Assert(subItem.SubGroupBys.Empty(), "") } } // GroupByRange集計操作の結果を取得します。 group2, err := groupByResults.GroupByRange("group2") // group2という名前の集計操作の結果を取得します。 if err != nil { panic(err) } fmt.Println("group2: ") for _, item := range group2.Items { // 返されたすべてのグループをトラバースします。 fmt.Println("\t[", item.From, ", ", item.To, "), rowCount: ", item.RowCount) // 各グループの行数を表示します。 } }
付録:複数フィールドグループ化の異なる方法
複数のフィールドに基づいてクエリ結果をグループ化する場合、ネストモードでgroupByパラメーターを使用するか、GroupByCompositeパラメーターを使用できます。次の表は、ネストモードのgroupByパラメーターとgroupByCompositeパラメーターの違いについて説明しています。
機能 | groupBy (ネスト) | groupByComposite |
サイズ | 2000 | 2000 |
フィールドの制限 | 最大5レベルがサポートされています。 | 最大32レベルがサポートされています。 |
ページネーション | サポートされていません | nextTokenパラメーターを使用してサポートされています |
グループ内の行の並べ替えルール |
| アルファベット順またはアルファベットの逆順 |
集計をサポート | はい | はい |
互換性 | 日付型のフィールドの場合、クエリ結果は指定された形式で返されます。 | DATE型のフィールドの場合、クエリ結果はタイムスタンプ文字列として返されます。 |