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

Tablestore:集約

最終更新日:Aug 12, 2026

Tablestore SDK for Go を使用して、メトリクスを計算するか、検索インデックスのクエリ結果をグループ化します。

前提条件

Tablestore Go SDK をインストールし、クライアントを初期化します。

説明

アグリゲーションは、クエリ結果の平均値、最大値、最小値、合計、カウント、個別カウント、パーセンタイル、または上位行を算出します。また、結果をフィールド、範囲、日付、地理的位置、フィルター、または複合キーでグループ化することもできます。メトリクスアグリゲーション、またはフィールド、範囲、もしくはヒストグラムに基づくグループ化で使用するフィールドは、ソートとアグリゲーションを有効にする必要があります。GroupByFilter のフィルターは、対応するクエリタイプのフィールド要件に従います。

重要
  • 個別カウントやパーセンタイル、フィールド値のグループ化では、近似計算を使用します。個別カウントが 10,000 未満の場合は正確な値に近く、1 億では誤差は約 2%です。P1 や P99 など両端に近いパーセンタイルは、通常 P50 よりも精度が高くなります。フィールド値のグループ化は並列で計算されるため、小さな誤差が生じる場合があります。

  • 複数のアグリゲーションを組み合わせることができます。アグリゲーションの数が多い、またはネストが深い場合、リクエストの複雑さが増し、レスポンスレイテンシーが増加します。ネストの制限については、「検索インデックスの制限」をご参照ください。

次の例では、検索インデックス内のすべてのデータをクエリし、price の最小値、最大値、合計、平均値、非 NULL のカウント、category の個別カウント、price の P50 パーセンタイルを算出し、データを category でグループ化します。

searchQuery := search.NewSearchQuery().
    SetQuery(&search.MatchAllQuery{}).
    SetLimit(0).
    Aggregation(
        search.NewMinAggregation("min_price", "price"),
        search.NewMaxAggregation("max_price", "price"),
        search.NewSumAggregation("sum_price", "price"),
        search.NewAvgAggregation("avg_price", "price"),
        search.NewCountAggregation("price_count", "price"),
        search.NewDistinctCountAggregation("category_count", "category"),
        search.NewPercentilesAggregation("price_percentiles", "price").
            SetPercents([]float64{50}),
    ).
    GroupBy(search.NewGroupByField("category_group", "category").Size(10))

response, err := client.Search(&tablestore.SearchRequest{
    TableName:   "example_table",
    IndexName:   "example_index",
    SearchQuery: searchQuery,
})
if err != nil {
    log.Fatal(err)
}

minResult, err := response.AggregationResults.Min("min_price")
if err != nil {
    log.Fatal(err)
}
maxResult, err := response.AggregationResults.Max("max_price")
if err != nil {
    log.Fatal(err)
}
sumResult, err := response.AggregationResults.Sum("sum_price")
if err != nil {
    log.Fatal(err)
}
avg, err := response.AggregationResults.Avg("avg_price")
if err != nil {
    log.Fatal(err)
}
countResult, err := response.AggregationResults.Count("price_count")
if err != nil {
    log.Fatal(err)
}
distinctResult, err := response.AggregationResults.DistinctCount("category_count")
if err != nil {
    log.Fatal(err)
}
percentilesResult, err := response.AggregationResults.Percentiles("price_percentiles")
if err != nil {
    log.Fatal(err)
}
groups, err := response.GroupByResults.GroupByField("category_group")
if err != nil {
    log.Fatal(err)
}

fmt.Println(minResult.Value, maxResult.Value, sumResult.Value)
fmt.Println(avg.Value)
fmt.Println(countResult.Value, distinctResult.Value)
fmt.Println(percentilesResult.PercentilesAggregationItems)
fmt.Println(groups.Items)

パラメーター

クエリリクエスト

名前

タイプ

説明

TableName (必須)

文字列

データテーブルの名前。

IndexName (必須)

文字列

多次元インデックスの名前。

SearchQuery (必須)

search.SearchQuery

クエリ条件、メトリック集計、およびグループ化設定。

ColumnsToGet (任意)

*tablestore.ColumnsToGet

返す列の設定。このパラメーターは、TopRowsAggregation がグループ内の行を返す場合にのみ有効です。省略した場合、プライマリキー列のみが返されます。

RoutingValues (任意)

[]*tablestore.PrimaryKey

カスタムルーティングフィールドのプライマリキー値。カスタムルーティングが設定されていない場合は、このパラメーターを省略してください。

TimeoutMs (任意)

*int32

リクエストタイムアウト期間 (ミリ秒単位)。

クエリ設定

名前

タイプ

説明

SetQuery (必須)

search.Query

クエリ条件を指定します。

SetOffset (任意)

int32

開始位置を指定します。デフォルト値: 0。オフセットベースのページネーションでは、Offset + Limit は 100,000 を超えることはできません。

SetLimit (任意)

int32

返される行の最大数を指定します。デフォルト値: 10。最大値: 100。値を 0 にすると、行は返されません。

SetCollapse (任意)

*search.Collapse

クエリ結果を折りたたみます。詳細については、「クエリ結果の折りたたみ」をご参照ください。

SetSort (任意)

*search.Sort

結果のソート順序を指定します。詳細については、「結果のソートとページネーション」をご参照ください。

SetGetTotalCount (任意)

bool

一致したすべての行をカウントするかどうかを指定します。デフォルト値: false。

SetToken (任意)

[]byte

前回のレスポンスで返された NextToken 値を指定します。このメソッドは、トークンに前ページのソート条件が含まれているため、Sort をクリアします。トークンベースのページネーションを使用する場合は、Offset を指定しないでください。

SetSearchFilter (任意)

*search.SearchFilter

ポストクエリフィルターを適用します。詳細については、「ポストクエリフィルターの使用」をご参照ください。

Aggregation (任意)

...search.Aggregation

集計を設定します。詳細については、「集計」をご参照ください。

GroupBy (任意)

...search.GroupBy

グループ化を設定します。詳細については、「集計」をご参照ください。

メトリック集計

名前

型

説明

AvgAggregation (任意)

search.AvgAggregation

平均を計算します。

MaxAggregation (任意)

search.MaxAggregation

最大値を計算します。

MinAggregation (任意)

search.MinAggregation

最小値を計算します。

SumAggregation (任意)

search.SumAggregation

合計を計算します。

CountAggregation (任意)

search.CountAggregation

NULL 以外の値をカウントします。

DistinctCountAggregation (任意)

search.DistinctCountAggregation

個別値をカウントします。

PercentilesAggregation (任意)

search.PercentilesAggregation

パーセンタイルを計算します。

TopRowsAggregation (任意)

search.TopRowsAggregation

グループ内の上位の行を返します。

MinAggregation、MaxAggregation、AvgAggregation、SumAggregation

名前

型

説明

AggName (必須)

string

結果を識別するための集計名です。

Field (必須)

string

集計フィールド。 Min、Max、Avg は Long、Double、Date フィールドをサポートします。 Sum は Long と Double フィールドをサポートします。

MissingValue (任意)

interface{}

フィールドが欠損している場合に使用される代替値。このパラメーターが指定されていない場合、フィールドが欠損している行は無視されます。

CountAggregation と DistinctCountAggregation

名前

型

説明

AggName (必須)

string

集計名。

Field (必須)

string

カウントするフィールド。 Long、Double、Boolean、Keyword、Date、IP、地理ポイントの各フィールドがサポートされています。フィールドが欠損している行はカウントに含まれません。

MissingValue (任意)

interface{}

DistinctCountAggregation でのみサポートされています。フィールドが欠損している場合、この値が個別値のカウントに使用されます。このパラメーターが指定されていない場合、フィールドが欠損している行は無視されます。

CountAggregation は、指定されたフィールドが NULL でない行をカウントし、スパースな列に適しています。クエリに一致するすべての行をカウントするには、 SetGetTotalCount(true) を呼び出し、 SearchResponse.TotalCount を読み取ります。多次元インデックス内のすべての行をカウントするには、 MatchAllQuery をクエリ条件として使用します。

PercentilesAggregation

PercentilesAggregation は、 Tablestore SDK for Go 1.7.0 以降でサポートされています。

名前

型

説明

AggName (必須)

string

集計名。

Field (必須)

string

集計フィールド。 Long、Double、Date フィールドがサポートされています。

Percents (必須)

[]float64

計算するパーセンタイル (25、50、90、99 など) 。

MissingValue (任意)

interface{}

フィールドが欠損している場合に使用される代替値。このパラメーターが指定されていない場合、フィールドが欠損している行は無視されます。

TopRowsAggregation

グループのサブ集計として TopRowsAggregation を使用します。この機能は、 Tablestore SDK for Go 1.7.0 以降でサポートされています。

名前

型

説明

AggName (必須)

string

集計名。

Limit (任意)

*int32

各グループ内で返される行の最大数。デフォルト値: 1。

Sort (任意)

*search.Sort

返される行のソート順。

SearchRequest.ColumnsToGet は、どの属性列を返すかを制御します。多次元インデックスから属性列を直接返すには、インデックスを作成するときに対応するフィールドを格納します。返す列が指定されていない場合、プライマリキー列のみが返されます。

グルーピング

名前

タイプ

説明

GroupByField (任意)

search.GroupByField

フィールド値でグループ化します。

GroupByRange (任意)

search.GroupByRange

数値範囲でグループ化します。

GroupByGeoDistance (任意)

search.GroupByGeoDistance

地理的距離でグループ化します。

GroupByFilter (任意)

search.GroupByFilter

フィルターでグループ化します。

GroupByHistogram (任意)

search.GroupByHistogram

固定数値間隔でグループ化します。

GroupByDateHistogram (任意)

search.GroupByDateHistogram

日付または時間間隔でグループ化します。

GroupByGeoGrid (任意)

search.GroupByGeoGrid

GeoHash グリッドでグループ化します。

GroupByComposite (任意)

search.GroupByComposite

複数フィールドの複合キーでグループ化し、ページネーションをサポートします。

GroupByField

名前

タイプ

説明

AggName (必須)

文字列

グループ名。

Field (必須)

文字列

グループフィールド。Long、Double、ブール値、キーワード、Date、および IP フィールドがサポートされています。

Sz (任意)

*int32

返されるグループの数。デフォルト値:10。最大値:2,000。

Sorters (任意)

[]search.GroupBySorter

グループのソート順序。複数のソーターはリスト順に適用されます。デフォルトでは、グループは行数の降順でソートされます。

SubAggList (任意)

[]search.Aggregation

サブアグリゲーション。

SubGroupByList (任意)

[]search.GroupBy

サブグループ。

グループのソート

次のグループソートタイプがサポートされています。

  • GroupKeyGroupBySort:グループキーを辞書順の昇順または降順でソートします。

  • RowCountGroupBySort:グループの行数を昇順または降順でソートします。行数の降順がデフォルトです。

  • SubAggGroupBySort:指定されたサブアグリゲーションの結果を昇順または降順でソートします。

GroupByRange

名前

タイプ

説明

AggName (必須)

文字列

グループ名。

Field (必須)

文字列

グループフィールド。Long および Double フィールドがサポートされています。

RangeList (必須)

[]search.Range

左閉右開のグループ範囲。境界には search.NegInf および search.Inf を使用できます。

SubAggList (任意)

[]search.Aggregation

サブアグリゲーション。

SubGroupByList (任意)

[]search.GroupBy

サブグループ。

GroupByGeoDistance

名前

タイプ

説明

AggName (必須)

文字列

グループ名。

Field (必須)

文字列

グループフィールド。ジオポイントフィールドのみがサポートされています。

Origin (必須)

search.GeoPoint

緯度経度順の中心座標。緯度の範囲は -90 から +90、経度の範囲は -180 から +180 です。

RangeList (必須)

[]search.Range

左閉右開の距離範囲 (メートル単位)。境界には search.NegInf および search.Inf を使用できます。

SubAggList (任意)

[]search.Aggregation

サブアグリゲーション。

SubGroupByList (任意)

[]search.GroupBy

サブグループ。

GroupByFilter

名前

タイプ

説明

AggName (必須)

文字列

グループ名。

Queries (必須)

[]search.Query

フィルター。結果の順序はクエリ条件の順序と一致します。

SubAggList (任意)

[]search.Aggregation

サブアグリゲーション。

SubGroupByList (任意)

[]search.GroupBy

サブグループ。

GroupByHistogram

名前

タイプ

説明

GroupByName (必須)

文字列

グループ名。

Field (必須)

文字列

グループフィールド。Long および Double フィールドがサポートされています。

Interval (必須)

interface{}

数値グループ間隔。

FieldRange (任意)

model.FieldRange

グルーピングに含まれるフィールド値範囲。設定する場合、(Max - Min) / Interval は 2,000 を超えることはできません。

Missing (任意)

interface{}

フィールドが欠損している場合に使用されるグループ値です。このパラメーターが指定されていない場合、フィールドが欠損している行は無視されます。

MinDocCount (任意)

*int64

グループが返されるために必要な最小行数です。

Sorters (任意)

[]search.GroupBySorter

グループのソート順序。

SubAggList (任意)

[]search.Aggregation

サブアグリゲーション。

SubGroupByList (任意)

[]search.GroupBy

サブグループ。

GroupByDateHistogram

GroupByDateHistogram は、Tablestore SDK for Go 1.7.10 以降でサポートされています。

名前

タイプ

説明

GroupByName (必須)

文字列

グループ名。

Field (必須)

文字列

グループフィールド。Date フィールドのみがサポートされています。

Interval (必須)

model.DateTimeValue

日付または時間間隔。値と時間単位で構成されています。

FieldRange (任意)

model.FieldRange

グルーピングに含まれるフィールド値範囲。設定する場合、(Max - Min) / Interval は 2,000 を超えることはできません。

Missing (任意)

interface{}

フィールドが欠損している場合に使用される日付グループ値です。このパラメーターが指定されていない場合、フィールドが欠損している行は無視されます。

MinDocCount (任意)

*int64

グループが返されるために必要な最小行数です。

TimeZone (任意)

*string

+hh:mm または -hh:mm の形式を使用します (例:+08:00)。Date フィールドの形式にタイムゾーンが含まれていない場合は、集約結果の時間オフセットを避けるためにこのパラメーターを設定します。

Sorters (任意)

[]search.GroupBySorter

グループのソート順序。

SubAggList (任意)

[]search.Aggregation

サブアグリゲーション。

SubGroupByList (任意)

[]search.GroupBy

サブグループ。

GroupByGeoGrid

GroupByGeoGrid は、Tablestore SDK for Go 1.7.12 以降でサポートされています。

名前

タイプ

説明

GroupByName (必須)

文字列

グループ名。

Field (必須)

文字列

ジオポイントフィールド。

Precision (必須)

model.GeoHashPrecision

GeoHash グリッドの精度。列挙序数が大きいほど、グリッドが小さくなります。

Size (必須)

int64

返されるグリッドグループの数。

SubAggList (任意)

[]search.Aggregation

サブアグリゲーション。

SubGroupByList (任意)

[]search.GroupBy

サブグループ。

GroupByComposite

GroupByComposite は、Tablestore SDK for Go 1.7.15 以降でサポートされています。

名前

タイプ

説明

GroupByName (必須)

文字列

グループ名。

SourceGroupByList (必須)

[]search.GroupBy

複合グループのソース。最大 32 フィールドがサポートされています。有効なソースタイプは、GroupByField、GroupByHistogram、および GroupByDateHistogram です。GroupByField ソースは、その名前、フィールド、およびソーターのみを使用します。GroupByHistogram ソースは、その名前、フィールド、間隔、およびソーターのみを使用します。GroupByDateHistogram ソースは TimeZone も使用できます。ソースはグループキーのソートのみをサポートし、デフォルトで降順です。フィールド値が存在しない場合、対応するキーは null になります。

Size (任意)

*int32

返される複合キーの数。デフォルト値:10。最大値:2,000。SuggestedSize と同時に指定しないでください。

SuggestedSize (任意)

*int32

Spark や Presto などの高スループットシナリオ用のソフトリミット。-1 またはサーバー制限を超える値を指定できます。実際に返される数は min(SuggestedSize、サーバーグループ制限、合計グループ数) です。Size と同時に指定しないでください。

NextToken (任意)

*string

前回のグループ化の結果で返されたページネーショントークンです。

SubAggList (任意)

[]search.Aggregation

サブアグリゲーション。

SubGroupByList (任意)

[]search.GroupBy

サブグループ。GroupByComposite 自体は、別のグループのサブグループとして使用できません。

レスポンス

SearchResponse.AggregationResults から集計名でメトリック結果を、SearchResponse.GroupByResults からグループ名でグルーピング結果を読み取ります。

メトリック集計結果

名前

型

説明

Avg、Max、Min、Sum

Value float64

集計名を指定して AggregationResults.Avg、Max、Min、または Sum を呼び出し、返されたオブジェクトから Value を読み取ります。Avg、Max、Min の場合、HasValue を呼び出して、結果に有効な値が含まれているかどうかを判断します。

Count、DistinctCount

Value int64

集計名を指定して AggregationResults.Count または DistinctCount を呼び出し、返されたオブジェクトから Value を読み取ります。

Percentiles

PercentilesAggregationItems []search.PercentilesAggregationItem

集計名を指定して AggregationResults.Percentiles を呼び出します。各項目では、Key はパーセンタイルで、Value は対応する値です。

トップ行

Value []model.Row

集計名を指定して AggregationResults.TopRows を呼び出し、返されたオブジェクトから Value を読み取ります。

グルーピング結果

名前

型

説明

GroupByField

[]search.GroupByFieldResultItem

GroupByResults.GroupByField を呼び出します。各項目には、Key、RowCount、SubAggregations、および SubGroupBys が含まれます。

GroupByRange

[]search.GroupByRangeResultItem

GroupByResults.GroupByRange を呼び出します。各項目には、From、To、RowCount、SubAggregations、および SubGroupBys が含まれます。

GroupByGeoDistance

[]search.GroupByGeoDistanceResultItem

GroupByResults.GroupByGeoDistance を呼び出します。各項目には、距離の境界を表す From と To、RowCount、SubAggregations、および SubGroupBys が含まれます。

GroupByFilter

[]search.GroupByFilterResultItem

GroupByResults.GroupByFilter を呼び出します。結果の順序は Queries と一致します。各項目には、RowCount、SubAggregations、および SubGroupBys が含まれます。

GroupByHistogram

[]search.GroupByHistogramItem

GroupByResults.GroupByHistogram を呼び出します。各項目では、Key はバケット値、Value は行数です。各項目には、SubAggregations と SubGroupBys も含まれます。

GroupByDateHistogram

[]search.GroupByDateHistogramItem

GroupByResults.GroupByDateHistogram を呼び出します。各項目には、ミリ秒単位のタイムスタンプである Timestamp、RowCount、SubAggregations、および SubGroupBys が含まれます。

GroupByGeoGrid

[]search.GroupByGeoGridResultItem

GroupByResults.GroupByGeoGrid を呼び出します。各項目には、ジオハッシュキーである Key、GeoGrid の境界、RowCount、SubAggregations、および SubGroupBys が含まれます。

GroupByComposite

[]search.GroupByCompositeResultItem

GroupByResults.GroupByComposite を呼び出します。SourceGroupByNames はキーの順序を指定します。各項目のキーはその順序に対応します。各項目には、RowCount、SubAggregations、および SubGroupBys も含まれます。NextToken は次のページのトークンです。

例

サブアグリゲーションとサブグループの使用

次の例では、行をカテゴリ別にグループ化し、各カテゴリの最高価格を計算し、さらに行をステータス別にグループ化します。

groupBy := search.NewGroupByField("category_group", "category").
    Size(10).
    SubAggregation(search.NewMaxAggregation("max_price", "price")).
    SubGroupBy(search.NewGroupByField("status_group", "status").Size(10))

searchQuery := search.NewSearchQuery().
    SetQuery(&search.MatchAllQuery{}).
    SetLimit(0).
    GroupBy(groupBy)
response, err := client.Search(&tablestore.SearchRequest{
    TableName:   "example_table",
    IndexName:   "example_index",
    SearchQuery: searchQuery,
})
if err != nil {
    log.Fatal(err)
}

result, err := response.GroupByResults.GroupByField("category_group")
if err != nil {
    log.Fatal(err)
}
for _, item := range result.Items {
    maxPrice, err := item.SubAggregations.Max("max_price")
    if err != nil {
        log.Fatal(err)
    }
    statuses, err := item.SubGroupBys.GroupByField("status_group")
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println(item.Key, maxPrice.Value, statuses.Items)
}

複数フィールドでのグループ化と結果のページネーション

GroupByComposite は、複数フィールドのグループ化結果をフラットな複合キーとして返し、NextToken を使用して後続のグループを読み取ります。

composite := search.NewGroupByComposite("category_status_group").
    SourceGroupBys(
        search.NewGroupByField("category", "category"),
        search.NewGroupByField("status", "status"),
    ).
    SetSize(100)

var nextToken *string
for {
    if nextToken != nil {
        composite.SetNextToken(nextToken)
    }
    searchQuery := search.NewSearchQuery().
        SetQuery(&search.MatchAllQuery{}).
        SetLimit(0).
        GroupBy(composite)
    response, err := client.Search(&tablestore.SearchRequest{
        TableName:   "example_table",
        IndexName:   "example_index",
        SearchQuery: searchQuery,
    })
    if err != nil {
        log.Fatal(err)
    }

    result, err := response.GroupByResults.GroupByComposite(
        "category_status_group",
    )
    if err != nil {
        log.Fatal(err)
    }
    for _, item := range result.Items {
        fmt.Println(item.Keys, item.RowCount)
    }

    nextToken = result.NextToken
    if nextToken == nil || *nextToken == "" {
        break
    }
}

範囲、距離、およびフィルターによるグループ化

次の例では、同じクエリで価格範囲、地理的距離、およびフィルターによって結果をグループ化します。

priceRanges := search.NewGroupByRange("price_ranges", "price").
    Range(0, 200).
    Range(200, 500)
distanceRanges := search.NewGroupByGeoDistance(
    "distance_ranges",
    "location",
    search.GeoPoint{Lat: 30.2741, Lon: 120.1551},
).
    Range(0, 100000).
    Range(100000, 1500000)
categoryFilters := search.NewGroupByFilter("category_filters").
    Query(&search.TermQuery{FieldName: "category", Term: "book-go"}).
    Query(&search.TermQuery{FieldName: "category", Term: "game"})

searchQuery := search.NewSearchQuery().
    SetQuery(&search.MatchAllQuery{}).
    SetLimit(0).
    GroupBy(priceRanges, distanceRanges, categoryFilters)
response, err := client.Search(&tablestore.SearchRequest{
    TableName:   "example_table",
    IndexName:   "example_index",
    SearchQuery: searchQuery,
})
if err != nil {
    log.Fatal(err)
}

priceResult, err := response.GroupByResults.GroupByRange("price_ranges")
if err != nil {
    log.Fatal(err)
}
distanceResult, err := response.GroupByResults.GroupByGeoDistance(
    "distance_ranges",
)
if err != nil {
    log.Fatal(err)
}
filterResult, err := response.GroupByResults.GroupByFilter("category_filters")
if err != nil {
    log.Fatal(err)
}
fmt.Println(priceResult.Items)
fmt.Println(distanceResult.Items)
fmt.Println(filterResult.Items)

数値および日付ヒストグラムの生成

次の例では、固定価格間隔を使用した数値ヒストグラムと月次の日付ヒストグラムを生成します。

groupKeyAscending := []search.GroupBySorter{
    &search.GroupKeyGroupBySort{Order: search.SortOrder_ASC.Enum()},
}
priceHistogram := search.NewGroupByHistogram("price_histogram", "price").
    SetInterval(int64(200)).
    SetFieldRange(int64(0), int64(600)).
    SetMinDocCount(1).
    SetGroupBySorters(groupKeyAscending)
dateHistogram := search.NewGroupByDateHistogram(
    "date_histogram",
    "event_time",
).
    SetInterval(model.DateTimeValue{
        Value: proto.Int32(1),
        Unit:  model.DateTimeUnit_MONTH.Enum(),
    }).
    SetFieldRange("2026-01-01T00:00:00", "2026-05-01T00:00:00").
    SetTimeZone("+08:00").
    SetMinDocCount(1).
    SetGroupBySorters(groupKeyAscending)

searchQuery := search.NewSearchQuery().
    SetQuery(&search.MatchAllQuery{}).
    SetLimit(0).
    GroupBy(priceHistogram, dateHistogram)
response, err := client.Search(&tablestore.SearchRequest{
    TableName:   "example_table",
    IndexName:   "example_index",
    SearchQuery: searchQuery,
})
if err != nil {
    log.Fatal(err)
}

priceResult, err := response.GroupByResults.GroupByHistogram("price_histogram")
if err != nil {
    log.Fatal(err)
}
dateResult, err := response.GroupByResults.GroupByDateHistogram("date_histogram")
if err != nil {
    log.Fatal(err)
}
fmt.Println(priceResult.Items)
fmt.Println(dateResult.Items)

地理グリッドによるグループ化

次の例では、約 39 km × 19 km の GeoHash グリッドによって地理フィールドをグループ化します。

searchQuery := search.NewSearchQuery().
    SetQuery(&search.MatchAllQuery{}).
    SetLimit(0).
    GroupBy(
        search.NewGroupByGeoGrid("geo_grid", "location").
            SetPrecision(model.GHP_39KM_19KM_4).
            SetSize(100),
    )
response, err := client.Search(&tablestore.SearchRequest{
    TableName:   "example_table",
    IndexName:   "example_index",
    SearchQuery: searchQuery,
})
if err != nil {
    log.Fatal(err)
}

result, err := response.GroupByResults.GroupByGeoGrid("geo_grid")
if err != nil {
    log.Fatal(err)
}
fmt.Println(result.Items)

グループ内の行の取得

次の例では、行をカテゴリ別にグループ化し、各カテゴリで価格が最も高い行を返します。

topRows := search.NewTopRowsAggregation("top_price").
    SetLimit(1).
    SetSort(&search.Sort{Sorters: []search.Sorter{
        &search.FieldSort{
            FieldName: "price",
            Order:     search.SortOrder_DESC.Enum(),
        },
    }})
groupBy := search.NewGroupByField("category_group", "category").
    Size(10).
    SubAggregation(topRows)
searchQuery := search.NewSearchQuery().
    SetQuery(&search.MatchAllQuery{}).
    SetLimit(0).
    GroupBy(groupBy)

response, err := client.Search(&tablestore.SearchRequest{
    TableName:   "example_table",
    IndexName:   "example_index",
    SearchQuery: searchQuery,
    ColumnsToGet: &tablestore.ColumnsToGet{
        Columns: []string{"category", "price"},
    },
})
if err != nil {
    log.Fatal(err)
}

groups, err := response.GroupByResults.GroupByField("category_group")
if err != nil {
    log.Fatal(err)
}
for _, item := range groups.Items {
    rows, err := item.SubAggregations.TopRows("top_price")
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println(item.Key, rows.Value)
}

複数フィールドのグループ化メソッドの比較

複数のフィールドでグループ化するには、複数の GroupByField をネストするか、GroupByComposite を使用します。結果の構造、ソート要件、ページネーションが必要かどうかに基づいて選択してください。

メソッド

特徴

ネストされた GroupByField

階層的な親子グループを返します。各レベルで最大 2,000 グループを返します。グループのページネーションはサポートされていません。グループキー、行数、またはサブ集計値によるソートと、サブ集計がサポートされています。

GroupByComposite

最大 32 フィールドのフラットな複合キーを返します。各ページで最大 2,000 グループを返し、NextToken によるページネーションをサポートします。各ソースはグループキーによるソートのみをサポートし、デフォルトで降順です。Date グループキーはタイムスタンプ文字列として返されます。