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