Todos os produtos
Search
Central de documentação

Tablestore:Agregação

Última atualização: Sep 15, 2026

Use o Tablestore SDK for Go para calcular métricas ou agrupar resultados de consultas em índices de busca.

Pré-requisitos

Instale o Tablestore Go SDK e inicialize um cliente.

Descrição

A agregação calcula médias, valores máximos, mínimos, somas, contagens, contagens distintas, percentis ou linhas principais sobre os resultados da consulta. Também é possível agrupar os resultados por campos, intervalos, datas, localizações geográficas, filtros ou chaves compostas. Ative a ordenação e a agregação para os campos usados em agregações de métricas ou em agrupamentos baseados em campos, intervalos ou histogramas. Os filtros no GroupByFilter seguem os requisitos de campo do tipo de consulta correspondente.

Importante
  • Contagens distintas, percentis e agrupamentos por valor de campo usam cálculos aproximados. Uma contagem distinta abaixo de 10.000 aproxima-se do valor exato, com margem de erro de cerca de 2% para 100 milhões. Percentis mais próximos das extremidades, como P1 e P99, tendem a ser mais precisos que o P50. O agrupamento por valor de campo pode apresentar pequeno erro devido ao cálculo paralelo.

  • Combine múltiplas agregações conforme necessário. Um grande volume de agregações ou aninhamentos profundos aumenta a complexidade da requisição e a latência da resposta. Para limites de aninhamento, consulte Search index limits.

O exemplo a seguir consulta todos os dados em um índice de busca, calcula o mínimo, máximo, soma, média, contagem de valores não nulos, contagem distinta de categorias e P50 dos preços, além de agrupar os dados por categoria.

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)

Parâmetros

Requisição de consulta

Nome

Tipo

Descrição

TableName (obrigatório)

string

Nome da tabela de dados.

IndexName (obrigatório)

string

Nome do índice de busca.

SearchQuery (obrigatório)

search.SearchQuery

Condição de consulta, agregações de métricas e configurações de agrupamento.

ColumnsToGet (opcional)

*tablestore.ColumnsToGet

Configuração das colunas de retorno. Este parâmetro tem efeito apenas quando TopRowsAggregation retorna linhas dentro de grupos. Se omitido, o sistema retorna apenas as colunas de chave primária.

RoutingValues (opcional)

[]*tablestore.PrimaryKey

Valores de chave primária para campos de roteamento personalizado. Omita este parâmetro se o roteamento personalizado não estiver configurado.

TimeoutMs (opcional)

*int32

Tempo limite da requisição em milissegundos.

Configuração da consulta

Nome

Tipo

Descrição

SetQuery (obrigatório)

search.Query

Defina a condição de consulta.

SetOffset (opcional)

int32

Especifique a posição inicial. Valor padrão: 0. Na paginação baseada em offset, a soma de Offset + Limit não pode exceder 100.000.

SetLimit (opcional)

int32

Determina o número máximo de linhas a retornar. Valor padrão: 10. Valor máximo: 100. Um valor igual a 0 não retorna linhas.

SetCollapse (opcional)

*search.Collapse

Colapsa os resultados da consulta. Para mais informações, consulte Collapse query results.

SetSort (opcional)

*search.Sort

Defina a ordem de classificação dos resultados. Para mais informações, consulte Sort and paginate results.

SetGetTotalCount (opcional)

bool

Indica se deve contar todas as linhas correspondentes. Valor padrão: false.

SetToken (opcional)

[]byte

Especifique o valor NextToken retornado pela resposta anterior. Este método limpa a configuração de Sort porque o token já contém as condições de ordenação da página anterior. Não especifique Offset ao usar paginação baseada em token.

SetSearchFilter (opcional)

*search.SearchFilter

Aplica um filtro pós-consulta. Para mais informações, consulte Use post-query filters.

Aggregation (opcional)

...search.Aggregation

Configure as agregações. Para mais informações, consulte Aggregation.

GroupBy (opcional)

...search.GroupBy

Configure o agrupamento. Para mais informações, consulte Aggregation.

Agregações de métricas

Nome

Tipo

Descrição

AvgAggregation (opcional)

search.AvgAggregation

Calcula a média.

MaxAggregation (opcional)

search.MaxAggregation

Calcula o valor máximo.

MinAggregation (opcional)

search.MinAggregation

Calcula o valor mínimo.

SumAggregation (opcional)

search.SumAggregation

Calcula a soma.

CountAggregation (opcional)

search.CountAggregation

Conta valores não nulos.

DistinctCountAggregation (opcional)

search.DistinctCountAggregation

Conta valores distintos.

PercentilesAggregation (opcional)

search.PercentilesAggregation

Calcula percentis.

TopRowsAggregation (opcional)

search.TopRowsAggregation

Retorna as principais linhas dentro de um grupo.

MinAggregation, MaxAggregation, AvgAggregation e SumAggregation

Nome

Tipo

Descrição

AggName (obrigatório)

string

Nome da agregação, usado para identificar o resultado.

Field (obrigatório)

string

Campo da agregação. Min, Max e Avg aceitam campos Long, Double e Date. Sum aceita campos Long e Double.

MissingValue (opcional)

interface{}

Valor substituto usado quando o campo está ausente. Se este parâmetro não for especificado, o sistema ignora as linhas sem esse campo.

CountAggregation e DistinctCountAggregation

Nome

Tipo

Descrição

AggName (obrigatório)

string

Nome da agregação.

Field (obrigatório)

string

Campo a ser contado. Campos Long, Double, Boolean, Keyword, Date, IP e Geo-point são aceitos. A contagem não inclui linhas onde o campo está ausente.

MissingValue (opcional)

interface{}

Aceito apenas por DistinctCountAggregation. Valor usado para contagem distinta quando o campo está ausente. Se não especificado, o sistema ignora linhas sem esse campo.

CountAggregation conta linhas nas quais o campo especificado não é nulo, sendo adequado para colunas esparsas. Para contar todas as linhas correspondentes a uma consulta, chame SetGetTotalCount(true) e leia SearchResponse.TotalCount. Para contar todas as linhas em um índice de busca, use MatchAllQuery como condição de consulta.

PercentilesAggregation

PercentilesAggregation é compatível com o Tablestore SDK for Go versão 1.7.0 e posteriores.

Nome

Tipo

Descrição

AggName (obrigatório)

string

Nome da agregação.

Field (obrigatório)

string

Campo da agregação. Campos Long, Double e Date são aceitos.

Percents (obrigatório)

[]float64

Percentis a calcular, como 25, 50, 90 e 99.

MissingValue (opcional)

interface{}

Valor substituto usado quando o campo está ausente. Se este parâmetro não for especificado, o sistema ignora as linhas sem esse campo.

TopRowsAggregation

Use TopRowsAggregation como uma subagregação de um grupo. Este recurso é compatível com o Tablestore SDK for Go versão 1.7.0 e posteriores.

Nome

Tipo

Descrição

AggName (obrigatório)

string

Nome da agregação.

Limit (opcional)

*int32

Número máximo de linhas retornadas dentro de cada grupo. Valor padrão: 1.

Sort (opcional)

*search.Sort

Ordem de classificação das linhas retornadas.

SearchRequest.ColumnsToGet controla quais colunas de atributo são retornadas. Para retornar colunas de atributo diretamente do índice de busca, armazene os campos correspondentes ao criar o índice. Se as colunas de retorno não forem especificadas, o sistema retorna apenas as colunas de chave primária.

Agrupamento

Nome

Tipo

Descrição

GroupByField (opcional)

search.GroupByField

Agrupa por valor de campo.

GroupByRange (opcional)

search.GroupByRange

Agrupa por intervalo numérico.

GroupByGeoDistance (opcional)

search.GroupByGeoDistance

Agrupa por distância geográfica.

GroupByFilter (opcional)

search.GroupByFilter

Agrupa por filtro.

GroupByHistogram (opcional)

search.GroupByHistogram

Agrupa por intervalos numéricos fixos.

GroupByDateHistogram (opcional)

search.GroupByDateHistogram

Agrupa por intervalos de data ou hora.

GroupByGeoGrid (opcional)

search.GroupByGeoGrid

Agrupa por grade GeoHash.

GroupByComposite (opcional)

search.GroupByComposite

Agrupa por uma chave composta de múltiplos campos e aceita paginação.

GroupByField

Nome

Tipo

Descrição

AggName (obrigatório)

string

Nome do grupo.

Field (obrigatório)

string

Campo de agrupamento. Campos Long, Double, Boolean, Keyword, Date e IP são aceitos.

Sz (opcional)

*int32

Número de grupos a retornar. Valor padrão: 10. Valor máximo: 2.000.

Sorters (opcional)

[]search.GroupBySorter

Ordem de classificação dos grupos. Múltiplos classificadores têm efeito na ordem da lista. Por padrão, os grupos são classificados por contagem de linhas em ordem decrescente.

SubAggList (opcional)

[]search.Aggregation

Subagregações.

SubGroupByList (opcional)

[]search.GroupBy

Subgrupos.

Classificação de grupos

Os seguintes tipos de classificação de grupos são aceitos:

  • GroupKeyGroupBySort: Classifica as chaves de grupo em ordem lexical ascendente ou descendente.

  • RowCountGroupBySort: Classifica pela contagem de linhas do grupo em ordem ascendente ou descendente. A ordem decrescente de contagem de linhas é o padrão.

  • SubAggGroupBySort: Classifica pelo resultado da subagregação especificada em ordem ascendente ou descendente.

GroupByRange

Nome

Tipo

Descrição

AggName (obrigatório)

string

Nome do grupo.

Field (obrigatório)

string

Campo de agrupamento. Campos Long e Double são aceitos.

RangeList (obrigatório)

[]search.Range

Intervalos de grupo fechados à esquerda e abertos à direita. Os limites podem usar search.NegInf e search.Inf.

SubAggList (opcional)

[]search.Aggregation

Subagregações.

SubGroupByList (opcional)

[]search.GroupBy

Subgrupos.

GroupByGeoDistance

Nome

Tipo

Descrição

AggName (obrigatório)

string

Nome do grupo.

Field (obrigatório)

string

Campo de agrupamento. Apenas campos Geo-point são aceitos.

Origin (obrigatório)

search.GeoPoint

Coordenada central na ordem latitude-longitude. A latitude varia de -90 a +90 e a longitude de -180 a +180.

RangeList (obrigatório)

[]search.Range

Intervalos de distância fechados à esquerda e abertos à direita, em metros. Os limites podem usar search.NegInf e search.Inf.

SubAggList (opcional)

[]search.Aggregation

Subagregações.

SubGroupByList (opcional)

[]search.GroupBy

Subgrupos.

GroupByFilter

Nome

Tipo

Descrição

AggName (obrigatório)

string

Nome do grupo.

Queries (obrigatório)

[]search.Query

Os filtros. A ordem dos resultados corresponde à ordem das condições de consulta.

SubAggList (opcional)

[]search.Aggregation

Subagregações.

SubGroupByList (opcional)

[]search.GroupBy

Subgrupos.

GroupByHistogram

Nome

Tipo

Descrição

GroupByName (obrigatório)

string

Nome do grupo.

Field (obrigatório)

string

Campo de agrupamento. Campos Long e Double são aceitos.

Interval (obrigatório)

interface{}

Intervalo numérico de agrupamento.

FieldRange (opcional)

model.FiledRange

Faixa de valores do campo incluída no agrupamento. Se configurado, (Max - Min) / Interval não pode exceder 2.000.

Missing (opcional)

interface{}

Valor de grupo usado quando o campo está ausente. Se este parâmetro não for especificado, o sistema ignora as linhas sem esse campo.

MinDocCount (opcional)

*int64

Número mínimo de linhas necessário para que um grupo seja retornado.

Sorters (opcional)

[]search.GroupBySorter

Ordem de classificação dos grupos.

SubAggList (opcional)

[]search.Aggregation

Subagregações.

SubGroupByList (opcional)

[]search.GroupBy

Subgrupos.

GroupByDateHistogram

GroupByDateHistogram é compatível com o Tablestore SDK for Go versão 1.7.10 e posteriores.

Nome

Tipo

Descrição

GroupByName (obrigatório)

string

Nome do grupo.

Field (obrigatório)

string

Campo de agrupamento. Apenas campos Date são aceitos.

Interval (obrigatório)

model.DateTimeValue

Intervalo de data ou hora, composto por um valor e uma unidade de tempo.

FieldRange (opcional)

model.FiledRange

Faixa de valores do campo incluída no agrupamento. Se configurado, (Max - Min) / Interval não pode exceder 2.000.

Missing (opcional)

interface{}

Valor de grupo de data usado quando o campo está ausente. Se este parâmetro não for especificado, o sistema ignora as linhas sem esse campo.

MinDocCount (opcional)

*int64

Número mínimo de linhas necessário para que um grupo seja retornado.

TimeZone (opcional)

*string

Use o formato +hh:mm ou -hh:mm, como +08:00. Se o formato do campo Date não contiver um fuso horário, defina este parâmetro para evitar deslocamento de tempo nos resultados da agregação.

Sorters (opcional)

[]search.GroupBySorter

Ordem de classificação dos grupos.

SubAggList (opcional)

[]search.Aggregation

Subagregações.

SubGroupByList (opcional)

[]search.GroupBy

Subgrupos.

GroupByGeoGrid

GroupByGeoGrid é compatível com o Tablestore SDK for Go versão 1.7.12 e posteriores.

Nome

Tipo

Descrição

GroupByName (obrigatório)

string

Nome do grupo.

Field (obrigatório)

string

Campo Geo-point.

Precision (obrigatório)

model.GeoHashPrecision

Precisão da grade GeoHash. Um ordinal enum maior representa uma grade menor.

Size (obrigatório)

int64

Número de grupos de grade a retornar.

SubAggList (opcional)

[]search.Aggregation

Subagregações.

SubGroupByList (opcional)

[]search.GroupBy

Subgrupos.

GroupByComposite

GroupByComposite é compatível com o Tablestore SDK for Go versão 1.7.15 e posteriores.

Nome

Tipo

Descrição

GroupByName (obrigatório)

string

Nome do grupo.

SourceGroupByList (obrigatório)

[]search.GroupBy

Fontes do grupo composto. Até 32 campos são aceitos. Tipos de source válidos são GroupByField, GroupByHistogram e GroupByDateHistogram. Uma source GroupByField usa apenas seu nome, campo e classificadores. Uma source GroupByHistogram usa apenas seu nome, campo, intervalo e classificadores. Uma source GroupByDateHistogram também pode usar TimeZone. As fontes aceitam apenas classificação por chave de grupo, em ordem decrescente por padrão. Se um valor de campo não existir, a chave correspondente será nula.

Size (opcional)

*int32

Número de chaves compostas a retornar. Valor padrão: 10. Valor máximo: 2.000. Não especifique este parâmetro junto com SuggestedSize.

SuggestedSize (opcional)

*int32

Limite flexível para cenários de alto throughput, como Spark e Presto. É possível especificar -1 ou um valor acima do limite do servidor. O número real retornado é min(SuggestedSize, limite de grupos do servidor, total de grupos). Não especifique este parâmetro junto com Size.

NextToken (opcional)

*string

Token de paginação retornado pelo resultado do grupo anterior.

SubAggList (opcional)

[]search.Aggregation

Subagregações.

SubGroupByList (opcional)

[]search.GroupBy

Subgrupos. O próprio GroupByComposite não pode ser usado como subgrupo de outro grupo.

Resposta

Leia os resultados de métricas pelo nome da agregação em SearchResponse.AggregationResults e os resultados de agrupamento pelo nome do grupo em SearchResponse.GroupByResults.

Resultados de agregação de métricas

Nome

Tipo

Descrição

Avg, Max, Min, Sum

Value float64

Chame AggregationResults.Avg, Max, Min ou Sum com o nome da agregação e leia Value do objeto retornado. Para Avg, Max e Min, chame HasValue para determinar se o resultado contém um valor válido.

Count, DistinctCount

Value int64

Chame AggregationResults.Count ou DistinctCount com o nome da agregação e leia Value do objeto retornado.

Percentiles

PercentilesAggregationItems []search.PercentilesAggregationItem

Chame AggregationResults.Percentiles com o nome da agregação. Em cada item, Key é o percentil e Value é o valor correspondente.

TopRows

Value []model.Row

Chame AggregationResults.TopRows com o nome da agregação e leia Value do objeto retornado.

Resultados de agrupamento

Nome

Tipo

Descrição

GroupByField

[]search.GroupByFieldResultItem

Chame GroupByResults.GroupByField. Cada item contém Key, RowCount, SubAggregations e SubGroupBys.

GroupByRange

[]search.GroupByRangeResultItem

Chame GroupByResults.GroupByRange. Cada item contém From, To, RowCount, SubAggregations e SubGroupBys.

GroupByGeoDistance

[]search.GroupByGeoDistanceResultItem

Chame GroupByResults.GroupByGeoDistance. Cada item contém os limites de distância From e To, RowCount, SubAggregations e SubGroupBys.

GroupByFilter

[]search.GroupByFilterResultItem

Chame GroupByResults.GroupByFilter. A ordem dos resultados corresponde a Queries. Cada item contém RowCount, SubAggregations e SubGroupBys.

GroupByHistogram

[]search.GroupByHistogramItem

Chame GroupByResults.GroupByHistogram. Em cada item, Key é o valor do bucket e Value é a contagem de linhas. Cada item também contém SubAggregations e SubGroupBys.

GroupByDateHistogram

[]search.GroupByDateHistogramItem

Chame GroupByResults.GroupByDateHistogram. Cada item contém o timestamp em milissegundos Timestamp, RowCount, SubAggregations e SubGroupBys.

GroupByGeoGrid

[]search.GroupByGeoGridResultItem

Chame GroupByResults.GroupByGeoGrid. Cada item contém a Key GeoHash, limites do GeoGrid, RowCount, SubAggregations e SubGroupBys.

GroupByComposite

[]search.GroupByCompositeResultItem

Chame GroupByResults.GroupByComposite. SourceGroupByNames especifica a ordem das chaves. As Keys em cada item correspondem a essa ordem. Cada item também contém RowCount, SubAggregations e SubGroupBys. NextToken é o token para a próxima página.

Exemplos

Usar subagregações e subgrupos

O exemplo a seguir agrupa linhas por categoria, calcula o preço máximo em cada categoria e agrupa ainda mais as linhas por 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)
}

Agrupar por múltiplos campos e paginar resultados

GroupByComposite retorna resultados de agrupamento de múltiplos campos como chaves compostas planas e usa NextToken para ler grupos subsequentes.

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

Agrupar por intervalo, distância e filtro

O exemplo a seguir agrupa resultados por faixa de preço, distância geográfica e filtro na mesma consulta.

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)

Gerar histogramas numéricos e de data

O exemplo a seguir gera um histograma numérico usando intervalos fixos de preço e um histograma mensal de datas.

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)

Agrupar por grade geográfica

O exemplo a seguir agrupa um campo geográfico por grades GeoHash de aproximadamente 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)

Recuperar linhas dentro de grupos

O exemplo a seguir agrupa linhas por categoria e retorna a linha com o maior preço em cada categoria.

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

Comparar métodos de agrupamento de múltiplos campos

Para agrupar por múltiplos campos, aninhe vários valores GroupByField ou use GroupByComposite. Escolha com base na estrutura do resultado, nos requisitos de classificação e na necessidade de paginação.

Método

Características

GroupByField aninhado

Retorna grupos hierárquicos pai-filho. Cada nível retorna até 2.000 grupos. Não aceita paginação de grupos. Aceita classificação por chave de grupo, contagem de linhas ou valor de subagregação, além de subagregações.

GroupByComposite

Retorna chaves compostas planas para até 32 campos. Cada página retorna até 2.000 grupos e aceita paginação via NextToken. Cada source aceita apenas classificação por chave de grupo, com ordem decrescente como padrão. Uma chave de grupo Date é retornada como uma string de timestamp.