All Products
Search
Document Center

Tablestore:Aggregation

Last Updated:Aug 12, 2026

Gunakan Tablestore SDK for Go untuk menghitung metrik atau mengelompokkan hasil kueri indeks pencarian.

Prasyarat

Instal Tablestore Go SDK dan inisialisasi klien.

Deskripsi

Aggregation menghitung rata-rata, maksimum, minimum, jumlah, hitungan, hitungan unik, persentil, atau baris teratas dari hasil kueri. Hasil juga dapat dikelompokkan berdasarkan bidang, rentang, tanggal, lokasi geografis, filter, atau kunci komposit. Pengurutan dan aggregation harus diaktifkan untuk bidang yang digunakan dalam agregasi metrik atau pengelompokan berbasis bidang, rentang, atau histogram. Filter dalam GroupByFilter mengikuti persyaratan bidang dari jenis kueri yang sesuai.

Penting
  • Hitungan unik, persentil, dan pengelompokan berdasarkan nilai bidang menggunakan perhitungan perkiraan. Hitungan unik di bawah 10.000 mendekati nilai eksak, dengan kesalahan sekitar 2% pada 100 juta. Persentil yang lebih dekat ke ujung, seperti P1 dan P99, biasanya lebih akurat daripada P50. Pengelompokan berdasarkan nilai bidang mungkin memiliki sedikit kesalahan karena dihitung secara paralel.

  • Anda dapat menggabungkan beberapa agregasi. Jumlah agregasi yang besar atau tingkat nesting yang dalam meningkatkan kompleksitas permintaan dan latensi respons. Untuk batas nesting, lihat Batas indeks pencarian.

Contoh berikut melakukan kueri terhadap semua data dalam indeks pencarian, menghitung minimum, maksimum, jumlah, rata-rata, hitungan non-null, hitungan kategori unik, dan P50 dari harga, serta mengelompokkan data berdasarkan kategori.

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)

Parameter

Permintaan kueri

Name

Type

Description

TableName (required)

string

Nama tabel data.

IndexName (required)

string

Nama indeks pencarian.

SearchQuery (required)

search.SearchQuery

Kondisi kueri, agregasi metrik, dan konfigurasi pengelompokan.

ColumnsToGet (optional)

*tablestore.ColumnsToGet

Konfigurasi kolom yang dikembalikan. Parameter ini hanya berlaku ketika TopRowsAggregation mengembalikan baris dalam kelompok. Jika diabaikan, hanya kolom kunci primer yang dikembalikan.

RoutingValues (optional)

[]*tablestore.PrimaryKey

Nilai kunci primer untuk bidang routing kustom. Abaikan parameter ini jika routing kustom tidak dikonfigurasi.

TimeoutMs (optional)

*int32

Periode timeout permintaan dalam milidetik.

Konfigurasi kueri

Name

Type

Description

SetQuery (required)

search.Query

Menentukan kondisi kueri.

SetOffset (optional)

int32

Menentukan posisi awal. Nilai default: 0. Untuk paginasi berbasis offset, Offset + Limit tidak boleh melebihi 100.000.

SetLimit (optional)

int32

Menentukan jumlah maksimum baris yang dikembalikan. Nilai default: 10. Nilai maksimum: 100. Nilai 0 tidak mengembalikan baris apa pun.

SetCollapse (optional)

*search.Collapse

Menciutkan hasil kueri. Untuk informasi selengkapnya, lihat Menciutkan hasil kueri.

SetSort (optional)

*search.Sort

Menentukan urutan pengurutan hasil. Untuk informasi selengkapnya, lihat Mengurutkan dan memaginasi hasil.

SetGetTotalCount (optional)

bool

Menentukan apakah akan menghitung semua baris yang cocok. Nilai default: false.

SetToken (optional)

[]byte

Menentukan nilai NextToken yang dikembalikan oleh respons sebelumnya. Metode ini menghapus Sort karena token berisi kondisi pengurutan halaman sebelumnya. Jangan tentukan Offset saat menggunakan paginasi berbasis token.

SetSearchFilter (optional)

*search.SearchFilter

Terapkan filter pasca-kueri. Untuk informasi selengkapnya, lihat Menggunakan filter pasca-kueri.

Aggregation (optional)

...search.Aggregation

Mengonfigurasi agregasi. Untuk informasi selengkapnya, lihat Aggregation.

GroupBy (optional)

...search.GroupBy

Mengonfigurasi pengelompokan. Untuk informasi selengkapnya, lihat Aggregation.

Agregasi metrik

Name

Type

Description

AvgAggregation (optional)

search.AvgAggregation

Menghitung rata-rata.

MaxAggregation (optional)

search.MaxAggregation

Menghitung maksimum.

MinAggregation (optional)

search.MinAggregation

Menghitung minimum.

SumAggregation (optional)

search.SumAggregation

Menghitung jumlah.

CountAggregation (optional)

search.CountAggregation

Menghitung nilai non-null.

DistinctCountAggregation (optional)

search.DistinctCountAggregation

Menghitung nilai unik.

PercentilesAggregation (optional)

search.PercentilesAggregation

Menghitung persentil.

TopRowsAggregation (optional)

search.TopRowsAggregation

Mengembalikan baris teratas dalam suatu kelompok.

MinAggregation, MaxAggregation, AvgAggregation, dan SumAggregation

Name

Type

Description

AggName (required)

string

Nama agregasi, yang mengidentifikasi hasil.

Field (required)

string

Bidang agregasi. Min, Max, dan Avg mendukung bidang Long, Double, dan Date. Sum mendukung bidang Long dan Double.

MissingValue (optional)

interface{}

Nilai pengganti yang digunakan ketika bidang tidak ada. Jika parameter ini tidak ditentukan, baris yang tidak memiliki bidang tersebut diabaikan.

CountAggregation dan DistinctCountAggregation

Name

Type

Description

AggName (required)

string

Nama agregasi.

Field (required)

string

Bidang yang akan dihitung. Bidang Long, Double, Boolean, Keyword, Date, IP, dan Geo-point didukung. Count tidak mencakup baris yang tidak memiliki bidang tersebut.

MissingValue (optional)

interface{}

Hanya didukung oleh DistinctCountAggregation. Nilai ini digunakan untuk penghitungan unik ketika bidang tidak ada. Jika parameter ini tidak ditentukan, baris yang tidak memiliki bidang tersebut diabaikan.

CountAggregation menghitung baris yang memiliki bidang tertentu tidak null dan cocok untuk kolom sparse. Untuk menghitung semua baris yang cocok dengan kueri, panggil SetGetTotalCount(true) dan baca SearchResponse.TotalCount. Untuk menghitung semua baris dalam indeks pencarian, gunakan MatchAllQuery sebagai kondisi kueri.

PercentilesAggregation

PercentilesAggregation didukung oleh Tablestore SDK for Go versi 1.7.0 dan yang lebih baru.

Name

Type

Description

AggName (required)

string

Nama agregasi.

Field (required)

string

Bidang agregasi. Bidang Long, Double, dan Date didukung.

Percents (required)

[]float64

Persentil yang akan dihitung, seperti 25, 50, 90, dan 99.

MissingValue (optional)

interface{}

Nilai pengganti yang digunakan ketika bidang tidak ada. Jika parameter ini tidak ditentukan, baris yang tidak memiliki bidang tersebut diabaikan.

TopRowsAggregation

Gunakan TopRowsAggregation sebagai subagregasi dari suatu kelompok. Fitur ini didukung oleh Tablestore SDK for Go versi 1.7.0 dan yang lebih baru.

Name

Type

Description

AggName (required)

string

Nama agregasi.

Limit (optional)

*int32

Jumlah maksimum baris yang dikembalikan dalam setiap kelompok. Nilai default: 1.

Sort (optional)

*search.Sort

Urutan pengurutan baris yang dikembalikan.

SearchRequest.ColumnsToGet mengontrol kolom atribut mana yang dikembalikan. Untuk mengembalikan kolom atribut langsung dari indeks pencarian, simpan bidang yang sesuai saat membuat indeks. Jika kolom yang dikembalikan tidak ditentukan, hanya kolom kunci primer yang dikembalikan.

Pengelompokan

Name

Type

Description

GroupByField (optional)

search.GroupByField

Mengelompokkan berdasarkan nilai bidang.

GroupByRange (optional)

search.GroupByRange

Mengelompokkan berdasarkan rentang numerik.

GroupByGeoDistance (optional)

search.GroupByGeoDistance

Mengelompokkan berdasarkan jarak geografis.

GroupByFilter (optional)

search.GroupByFilter

Mengelompokkan berdasarkan filter.

GroupByHistogram (optional)

search.GroupByHistogram

Mengelompokkan berdasarkan interval numerik tetap.

GroupByDateHistogram (optional)

search.GroupByDateHistogram

Mengelompokkan berdasarkan interval tanggal atau waktu.

GroupByGeoGrid (optional)

search.GroupByGeoGrid

Mengelompokkan berdasarkan grid GeoHash.

GroupByComposite (optional)

search.GroupByComposite

Mengelompokkan berdasarkan kunci komposit dari beberapa bidang dan mendukung paginasi.

GroupByField

Name

Type

Description

AggName (required)

string

Nama kelompok.

Field (required)

string

Bidang pengelompokan. Bidang Long, Double, Boolean, Keyword, Date, dan IP didukung.

Sz (optional)

*int32

Jumlah kelompok yang dikembalikan. Nilai default: 10. Nilai maksimum: 2.000.

Sorters (optional)

[]search.GroupBySorter

Urutan pengurutan kelompok. Beberapa sorter berlaku sesuai urutan dalam daftar. Secara default, kelompok diurutkan berdasarkan jumlah baris secara menurun.

SubAggList (optional)

[]search.Aggregation

Subagregasi.

SubGroupByList (optional)

[]search.GroupBy

Subkelompok.

Pengurutan kelompok

Jenis pengurutan kelompok berikut didukung:

  • GroupKeyGroupBySort: Mengurutkan kunci kelompok secara leksikal menaik atau menurun.

  • RowCountGroupBySort: Mengurutkan berdasarkan jumlah baris kelompok secara menaik atau menurun. Urutan menurun berdasarkan jumlah baris adalah default.

  • SubAggGroupBySort: Mengurutkan berdasarkan hasil subagregasi yang ditentukan secara menaik atau menurun.

GroupByRange

Name

Type

Description

AggName (required)

string

Nama kelompok.

Field (required)

string

Bidang pengelompokan. Bidang Long dan Double didukung.

RangeList (required)

[]search.Range

Rentang kelompok tertutup kiri, terbuka kanan. Batas dapat menggunakan search.NegInf dan search.Inf.

SubAggList (optional)

[]search.Aggregation

Subagregasi.

SubGroupByList (optional)

[]search.GroupBy

Subkelompok.

GroupByGeoDistance

Name

Type

Description

AggName (required)

string

Nama kelompok.

Field (required)

string

Bidang pengelompokan. Hanya bidang Geo-point yang didukung.

Origin (required)

search.GeoPoint

Koordinat pusat dalam urutan lintang-bujur. Lintang berkisar dari -90 hingga +90, dan bujur berkisar dari -180 hingga +180.

RangeList (required)

[]search.Range

Rentang jarak tertutup kiri, terbuka kanan dalam meter. Batas dapat menggunakan search.NegInf dan search.Inf.

SubAggList (optional)

[]search.Aggregation

Subagregasi.

SubGroupByList (optional)

[]search.GroupBy

Subkelompok.

GroupByFilter

Name

Type

Description

AggName (required)

string

Nama kelompok.

Queries (required)

[]search.Query

Filter. Urutan hasil sesuai dengan urutan kondisi kueri.

SubAggList (optional)

[]search.Aggregation

Subagregasi.

SubGroupByList (optional)

[]search.GroupBy

Subkelompok.

GroupByHistogram

Name

Type

Description

GroupByName (required)

string

Nama kelompok.

Field (required)

string

Bidang pengelompokan. Bidang Long dan Double didukung.

Interval (required)

interface{}

Interval numerik kelompok.

FieldRange (optional)

model.FiledRange

Rentang nilai bidang yang disertakan dalam pengelompokan. Jika dikonfigurasi, (Max - Min) / Interval tidak boleh melebihi 2.000.

Missing (optional)

interface{}

Nilai kelompok yang digunakan ketika bidang tidak ada. Jika parameter ini tidak ditentukan, baris yang tidak memiliki bidang tersebut diabaikan.

MinDocCount (optional)

*int64

Jumlah minimum baris yang diperlukan agar kelompok dikembalikan.

Sorters (optional)

[]search.GroupBySorter

Urutan pengurutan kelompok.

SubAggList (optional)

[]search.Aggregation

Subagregasi.

SubGroupByList (optional)

[]search.GroupBy

Subkelompok.

GroupByDateHistogram

GroupByDateHistogram didukung oleh Tablestore SDK for Go versi 1.7.10 dan yang lebih baru.

Name

Type

Description

GroupByName (required)

string

Nama kelompok.

Field (required)

string

Bidang pengelompokan. Hanya bidang Date yang didukung.

Interval (required)

model.DateTimeValue

Interval tanggal atau waktu, terdiri atas nilai dan satuan waktu.

FieldRange (optional)

model.FiledRange

Rentang nilai bidang yang disertakan dalam pengelompokan. Jika dikonfigurasi, (Max - Min) / Interval tidak boleh melebihi 2.000.

Missing (optional)

interface{}

Nilai kelompok tanggal yang digunakan ketika bidang tidak ada. Jika parameter ini tidak ditentukan, baris yang tidak memiliki bidang tersebut diabaikan.

MinDocCount (optional)

*int64

Jumlah minimum baris yang diperlukan agar kelompok dikembalikan.

TimeZone (optional)

*string

Gunakan format +hh:mm atau -hh:mm, seperti +08:00. Jika format bidang Date tidak mengandung zona waktu, atur parameter ini untuk menghindari offset waktu dalam hasil agregasi.

Sorters (optional)

[]search.GroupBySorter

Urutan pengurutan kelompok.

SubAggList (optional)

[]search.Aggregation

Subagregasi.

SubGroupByList (optional)

[]search.GroupBy

Subkelompok.

GroupByGeoGrid

GroupByGeoGrid didukung oleh Tablestore SDK for Go versi 1.7.12 dan yang lebih baru.

Name

Type

Description

GroupByName (required)

string

Nama kelompok.

Field (required)

string

Bidang Geo-point.

Precision (required)

model.GeoHashPrecision

Precisi grid GeoHash. Ordinal enum yang lebih besar merepresentasikan grid yang lebih kecil.

Size (required)

int64

Jumlah kelompok grid yang dikembalikan.

SubAggList (optional)

[]search.Aggregation

Subagregasi.

SubGroupByList (optional)

[]search.GroupBy

Subkelompok.

GroupByComposite

GroupByComposite didukung oleh Tablestore SDK for Go versi 1.7.15 dan yang lebih baru.

Name

Type

Description

GroupByName (required)

string

Nama kelompok.

SourceGroupByList (required)

[]search.GroupBy

Sumber kelompok komposit. Maksimal 32 bidang didukung. Jenis sumber yang valid adalah GroupByField, GroupByHistogram, dan GroupByDateHistogram. Sumber GroupByField hanya menggunakan nama, bidang, dan sorter-nya. Sumber GroupByHistogram hanya menggunakan nama, bidang, interval, dan sorter-nya. Sumber GroupByDateHistogram juga dapat menggunakan TimeZone. Sumber hanya mendukung pengurutan berdasarkan kunci kelompok, secara default menurun. Jika nilai bidang tidak ada, kunci yang sesuai bernilai null.

Size (optional)

*int32

Jumlah kunci komposit yang dikembalikan. Nilai default: 10. Nilai maksimum: 2.000. Jangan tentukan parameter ini bersamaan dengan SuggestedSize.

SuggestedSize (optional)

*int32

Batas lunak untuk skenario throughput tinggi seperti Spark dan Presto. Anda dapat menentukan -1 atau nilai di atas batas server. Jumlah aktual yang dikembalikan adalah min(SuggestedSize, batas kelompok server, total kelompok). Jangan tentukan parameter ini bersamaan dengan Size.

NextToken (optional)

*string

Token paginasi yang dikembalikan oleh hasil kelompok sebelumnya.

SubAggList (optional)

[]search.Aggregation

Subagregasi.

SubGroupByList (optional)

[]search.GroupBy

Subkelompok. GroupByComposite itu sendiri tidak dapat digunakan sebagai subkelompok dari kelompok lain.

Respons

Baca hasil metrik berdasarkan nama agregasi dari SearchResponse.AggregationResults dan hasil pengelompokan berdasarkan nama kelompok dari SearchResponse.GroupByResults.

Hasil agregasi metrik

Name

Type

Description

Avg、Max、Min、Sum

Value float64

Panggil AggregationResults.Avg, Max, Min, atau Sum dengan nama agregasi dan baca Value dari objek yang dikembalikan. Untuk Avg, Max, dan Min, panggil HasValue untuk menentukan apakah hasil berisi nilai yang valid.

Count、DistinctCount

Value int64

Panggil AggregationResults.Count atau DistinctCount dengan nama agregasi dan baca Value dari objek yang dikembalikan.

Percentiles

PercentilesAggregationItems []search.PercentilesAggregationItem

Panggil AggregationResults.Percentiles dengan nama agregasi. Di setiap item, Key adalah persentil dan Value adalah nilai yang sesuai.

TopRows

Value []model.Row

Panggil AggregationResults.TopRows dengan nama agregasi dan baca Value dari objek yang dikembalikan.

Hasil pengelompokan

Name

Type

Description

GroupByField

[]search.GroupByFieldResultItem

Panggil GroupByResults.GroupByField. Setiap item berisi Key, RowCount, SubAggregations, dan SubGroupBys.

GroupByRange

[]search.GroupByRangeResultItem

Panggil GroupByResults.GroupByRange. Setiap item berisi From, To, RowCount, SubAggregations, dan SubGroupBys.

GroupByGeoDistance

[]search.GroupByGeoDistanceResultItem

Panggil GroupByResults.GroupByGeoDistance. Setiap item berisi batas jarak From dan To, RowCount, SubAggregations, dan SubGroupBys.

GroupByFilter

[]search.GroupByFilterResultItem

Panggil GroupByResults.GroupByFilter. Urutan hasil sesuai dengan Queries. Setiap item berisi RowCount, SubAggregations, dan SubGroupBys.

GroupByHistogram

[]search.GroupByHistogramItem

Panggil GroupByResults.GroupByHistogram. Di setiap item, Key adalah nilai bucket dan Value adalah jumlah baris. Setiap item juga berisi SubAggregations dan SubGroupBys.

GroupByDateHistogram

[]search.GroupByDateHistogramItem

Panggil GroupByResults.GroupByDateHistogram. Setiap item berisi timestamp milidetik Timestamp, RowCount, SubAggregations, dan SubGroupBys.

GroupByGeoGrid

[]search.GroupByGeoGridResultItem

Panggil GroupByResults.GroupByGeoGrid. Setiap item berisi GeoHash Key, batas GeoGrid, RowCount, SubAggregations, dan SubGroupBys.

GroupByComposite

[]search.GroupByCompositeResultItem

Panggil GroupByResults.GroupByComposite. SourceGroupByNames menentukan urutan kunci. Kunci di setiap item sesuai dengan urutan tersebut. Setiap item juga berisi RowCount, SubAggregations, dan SubGroupBys. NextToken adalah token untuk halaman berikutnya.

Contoh

Gunakan subagregasi dan subkelompok

Contoh berikut mengelompokkan baris berdasarkan kategori, menghitung harga maksimum di setiap kategori, dan lebih lanjut mengelompokkan baris berdasarkan status.

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

Kelompokkan berdasarkan beberapa bidang dan paginasi hasil

GroupByComposite mengembalikan hasil pengelompokan multi-bidang sebagai kunci komposit datar dan menggunakan NextToken untuk membaca kelompok berikutnya.

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

Kelompokkan berdasarkan rentang, jarak, dan filter

Contoh berikut mengelompokkan hasil berdasarkan rentang harga, jarak geografis, dan filter dalam kueri yang sama.

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)

Buat histogram numerik dan tanggal

Contoh berikut membuat histogram numerik menggunakan interval harga tetap dan histogram tanggal bulanan.

groupKeyAscending := []search.GroupBySorter{
    &search.GroupKeyGroupBySort{Order: search.SortOrder_ASC.Enum()},
}
priceHistogram := search.NewGroupByHistogram("price_histogram", "price").
    SetInterval(int64(200)).
    SetFiledRange(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(),
    }).
    SetFiledRange("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)

Kelompokkan berdasarkan grid geografis

Contoh berikut mengelompokkan bidang geografis berdasarkan grid GeoHash dengan ukuran sekitar 39 km × 19 km.

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)

Ambil baris dalam kelompok

Contoh berikut mengelompokkan baris berdasarkan kategori dan mengembalikan baris dengan harga tertinggi di setiap kategori.

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

Bandingkan metode pengelompokan multi-bidang

Untuk mengelompokkan berdasarkan beberapa bidang, lakukan nesting beberapa nilai GroupByField atau gunakan GroupByComposite. Pilih berdasarkan struktur hasil, persyaratan pengurutan, dan kebutuhan paginasi.

Metode

Karakteristik

Nested GroupByField

Mengembalikan kelompok hierarkis induk-anak. Setiap level mengembalikan hingga 2.000 kelompok. Paginasi kelompok tidak didukung. Mendukung pengurutan berdasarkan kunci kelompok, jumlah baris, atau nilai subagregasi serta subagregasi.

GroupByComposite

Mengembalikan kunci komposit datar untuk hingga 32 bidang. Setiap halaman mengembalikan hingga 2.000 kelompok dan mendukung paginasi NextToken. Setiap sumber hanya mendukung pengurutan berdasarkan kunci kelompok dan secara default menurun. Kunci kelompok tanggal dikembalikan sebagai string timestamp.