使用 Tablestore Go SDK 對多元索引查詢結果計算指標或按條件分組。
前提條件
安裝Tablestore Go SDK並初始化用戶端。
功能說明
統計彙總在查詢結果上計算平均值、最大值、最小值、總和、計數、去重計數、百分位元或 TopRows,也可以按欄位、範圍、日期、地理位置、過濾條件和按鍵組合分組。用於指標彙總或按欄位值、範圍、長條圖等方式分組的欄位必須啟用排序與統計彙總;GroupByFilter 中的過濾條件遵循對應查詢類型的欄位要求。
去重計數、百分位元和欄位值分組採用近似計算。去重計數小於 1 萬時結果接近精確值,達到 1 億時誤差約為 2%。百分位越接近兩端通常越準確,例如 P1 或 P99 通常比 P50 更準確。欄位值分組並行計算時可能存在少量誤差。
多個統計彙總可以組合使用。彙總數量多或嵌套層級深時會增加請求複雜度並影響響應速度。嵌套層級限制請參見多元索引使用限制。
以下樣本查詢多元索引中的全部資料,計算價格的最小值、最大值、總和、平均值、非空值數量、類別去重數和 P50,並按類別分組。
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(必選) |
string |
資料表名稱。 |
|
IndexName(必選) |
string |
多元索引名稱。 |
|
SearchQuery(必選) |
search.SearchQuery |
查詢條件、指標彙總和分組配置。 |
|
ColumnsToGet(可選) |
*tablestore.ColumnsToGet |
返回列配置,僅 TopRowsAggregation 返回分組內行時生效。未設定時只返回主鍵列。 |
|
RoutingValues(可選) |
[]*tablestore.PrimaryKey |
自訂路由欄位對應的主索引值列表。未配置自訂路由時無需設定。 |
|
TimeoutMs(可選) |
*int32 |
請求級逾時時間,單位為毫秒。 |
查詢配置
|
名稱 |
類型 |
說明 |
|
SetQuery(必選) |
search.Query |
設定查詢條件。 |
|
SetOffset(可選) |
int32 |
設定本次查詢的起始位置,預設值為 0。使用 Offset 翻頁時,Offset + Limit 不能超過 100000。 |
|
SetLimit(可選) |
int32 |
設定本次查詢返回的最大行數,預設值為 10,最大值為 100。設定為 0 時不返回具體行。 |
|
SetCollapse(可選) |
*search.Collapse |
設定結果摺疊。配置方法請參見摺疊(去重)。 |
|
SetSort(可選) |
*search.Sort |
設定返回結果的排序方式。配置方法請參見排序和翻頁。 |
|
SetGetTotalCount(可選) |
bool |
是否統計匹配總行數,預設值為 false。 |
|
SetToken(可選) |
[]byte |
設定上一次響應返回的 NextToken,以繼續讀取後續資料。調用該方法會清除 Sort,因為 Token 已包含上一頁的排序條件。使用 Token 翻頁時不能設定 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 |
計算非空值數量。 |
|
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 和 Geo-point。Count 不統計欄位缺失的行。 |
|
MissingValue(可選) |
interface{} |
僅 DistinctCountAggregation 支援,欄位缺失時使用該值參與去重統計。未設定時忽略欄位缺失的行。 |
CountAggregation 統計指定欄位的非空值行數,適合稀疏列。若要統計查詢匹配總行數,請調用 SetGetTotalCount(true) 並讀取 SearchResponse.TotalCount;若要統計多元索引全部行,查詢條件使用 MatchAllQuery。
PercentilesAggregation
Go SDK 1.7.0 及以上版本支援 PercentilesAggregation。
|
名稱 |
類型 |
說明 |
|
AggName(必選) |
string |
彙總名稱。 |
|
Field(必選) |
string |
彙總欄位名稱,支援 Long、Double 和 Date。 |
|
Percents(必選) |
[]float64 |
要計算的百分位元,例如 25、50、90 和 99。 |
|
MissingValue(可選) |
interface{} |
欄位缺失時參與計算的替代值。未設定時忽略欄位缺失的行。 |
TopRowsAggregation
TopRowsAggregation 作為分組的子彙總使用。Go SDK 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(必選) |
string |
分組名稱。 |
|
Field(必選) |
string |
分組欄位名稱,支援 Long、Double、Boolean、Keyword、Date 和 IP。 |
|
Sz(可選) |
*int32 |
返回的分組數量,預設值為 10,最大值為 2000。 |
|
Sorters(可選) |
[]search.GroupBySorter |
分組排序方式,多個規則按列表順序生效。預設按分組內行數降序排列。 |
|
SubAggList(可選) |
[]search.Aggregation |
子彙總列表。 |
|
SubGroupByList(可選) |
[]search.GroupBy |
子分組列表。 |
分組排序
分組支援以下排序類型:
GroupKeyGroupBySort:按分組值的字典序升序或降序排列。RowCountGroupBySort:按分組內行數升序或降序排列,預設按此類型降序排列。SubAggGroupBySort:按指定子指標彙總的結果升序或降序排列。
GroupByRange
|
名稱 |
類型 |
說明 |
|
AggName(必選) |
string |
分組名稱。 |
|
Field(必選) |
string |
分組欄位名稱,支援 Long 和 Double。 |
|
RangeList(必選) |
[]search.Range |
左閉右開的分組範圍列表。邊界可使用 search.NegInf 和 search.Inf。 |
|
SubAggList(可選) |
[]search.Aggregation |
子彙總列表。 |
|
SubGroupByList(可選) |
[]search.GroupBy |
子分組列表。 |
GroupByGeoDistance
|
名稱 |
類型 |
說明 |
|
AggName(必選) |
string |
分組名稱。 |
|
Field(必選) |
string |
分組欄位名稱,僅支援 Geo-point。 |
|
Origin(必選) |
search.GeoPoint |
中心座標,緯度在前、經度在後。緯度範圍為 [-90,+90],經度範圍為 [-180,+180]。 |
|
RangeList(必選) |
[]search.Range |
左閉右開的距離範圍列表,單位為米。邊界可使用 search.NegInf 和 search.Inf。 |
|
SubAggList(可選) |
[]search.Aggregation |
子彙總列表。 |
|
SubGroupByList(可選) |
[]search.GroupBy |
子分組列表。 |
GroupByFilter
|
名稱 |
類型 |
說明 |
|
AggName(必選) |
string |
分組名稱。 |
|
Queries(必選) |
[]search.Query |
過濾條件列表,結果順序與查詢條件順序一致。 |
|
SubAggList(可選) |
[]search.Aggregation |
子彙總列表。 |
|
SubGroupByList(可選) |
[]search.GroupBy |
子分組列表。 |
GroupByHistogram
|
名稱 |
類型 |
說明 |
|
GroupByName(必選) |
string |
分組名稱。 |
|
Field(必選) |
string |
分組欄位名稱,支援 Long 和 Double。 |
|
Interval(必選) |
interface{} |
數值分組間隔。 |
|
FieldRange(可選) |
model.FiledRange |
參與分組的欄位值範圍。配置後,(Max - Min) / Interval 不能超過 2000。 |
|
Missing(可選) |
interface{} |
欄位缺失時使用的分組值。未設定時忽略欄位缺失的行。 |
|
MinDocCount(可選) |
*int64 |
返回分組需要包含的最少行數。 |
|
Sorters(可選) |
[]search.GroupBySorter |
分組排序方式。 |
|
SubAggList(可選) |
[]search.Aggregation |
子彙總列表。 |
|
SubGroupByList(可選) |
[]search.GroupBy |
子分組列表。 |
GroupByDateHistogram
Go SDK 1.7.10 及以上版本支援 GroupByDateHistogram。
|
名稱 |
類型 |
說明 |
|
GroupByName(必選) |
string |
分組名稱。 |
|
Field(必選) |
string |
分組欄位名稱,僅支援 Date。 |
|
Interval(必選) |
model.DateTimeValue |
日期或時間分組間隔,由數值和時間單位組成。 |
|
FieldRange(可選) |
model.FiledRange |
參與分組的欄位值範圍。配置後,(Max - Min) / Interval 不能超過 2000。 |
|
Missing(可選) |
interface{} |
欄位缺失時使用的日期分組值。未設定時忽略欄位缺失的行。 |
|
MinDocCount(可選) |
*int64 |
返回分組需要包含的最少行數。 |
|
TimeZone(可選) |
*string |
格式為 +hh:mm 或 -hh:mm,例如 +08:00。Date 欄位格式未包含時區時,可設定該參數避免彙總結果產生時差。 |
|
Sorters(可選) |
[]search.GroupBySorter |
分組排序方式。 |
|
SubAggList(可選) |
[]search.Aggregation |
子彙總列表。 |
|
SubGroupByList(可選) |
[]search.GroupBy |
子分組列表。 |
GroupByGeoGrid
Go SDK 1.7.12 及以上版本支援 GroupByGeoGrid。
|
名稱 |
類型 |
說明 |
|
GroupByName(必選) |
string |
分組名稱。 |
|
Field(必選) |
string |
Geo-point 欄位名稱。 |
|
Precision(必選) |
model.GeoHashPrecision |
GeoHash 網格精度。枚舉序號越大,網格越小。 |
|
Size(必選) |
int64 |
返回的網格分組數量。 |
|
SubAggList(可選) |
[]search.Aggregation |
子彙總列表。 |
|
SubGroupByList(可選) |
[]search.GroupBy |
子分組列表。 |
GroupByComposite
Go SDK 1.7.15 及以上版本支援 GroupByComposite。
|
名稱 |
類型 |
說明 |
|
GroupByName(必選) |
string |
分組名稱。 |
|
SourceGroupByList(必選) |
[]search.GroupBy |
多欄位分組源,最多包含 32 個欄位,僅支援 GroupByField、GroupByHistogram 和 GroupByDateHistogram。GroupByField 源只使用名稱、欄位和排序;GroupByHistogram 源只使用名稱、欄位、間隔和排序;GroupByDateHistogram 源還可使用 TimeZone。源只支援按分組值排序,預設降序;欄位值不存在時,對應鍵返回 null。 |
|
Size(可選) |
*int32 |
本次返回的按鍵組合數量,預設值為 10,最大值為 2000。不能與 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 為對應值。 |
|
TopRows |
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 擷取結果。每項包含 GeoHash Key、網格邊界 GeoGrid、RowCount、SubAggregations 和 SubGroupBys。 |
|
GroupByComposite |
[]search.GroupByCompositeResultItem |
調用 GroupByResults.GroupByComposite 擷取結果。SourceGroupByNames 表示鍵順序;每項的 Keys 與其一一對應,並包含 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)).
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)
按地理網格分組
以下樣本按約 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 |
按父子層級返回,每層最多返回 2000 個分組;不支援分組翻頁;支援按分組值、行數或子彙總值排序,並支援子彙總。 |
|
GroupByComposite |
以扁平按鍵組合返回,最多包含 32 個欄位;每頁最多返回 2000 個分組並支援通過 NextToken 翻頁;每個分組源僅支援按分組值排序,預設降序。Date 欄位的分組鍵以時間戳記字串返回。 |