Todos los productos
Search
Centro de documentos

Tablestore:Aggregation

Última actualización: Sep 14, 2026

Utilice el Tablestore SDK for Go para calcular métricas o agrupar los resultados de las consultas a un índice de búsqueda.

Requisitos previos

Instale Tablestore Go SDK e inicialice un cliente.

Descripción

La agregación calcula promedios, valores máximos, mínimos, sumas, conteos, conteos distintos, percentiles o filas principales sobre los resultados de una consulta. También es posible agrupar los resultados por campos, rangos, fechas, ubicaciones geográficas, filtros o claves compuestas. Debe habilitar la ordenación y la agregación en los campos que utilice para las agregaciones de métricas o para las agrupaciones basadas en campos, rangos o histogramas. Los filtros en GroupByFilter siguen los requisitos de campo del tipo de consulta correspondiente.

Importante
  • Los conteos distintos, los percentiles y la agrupación por valor de campo utilizan cálculos aproximados. Un conteo distinto menor a 10,000 se acerca al valor exacto, mientras que el error ronda el 2 % al llegar a 100 millones. Los percentiles cercanos a los extremos, como P1 y P99, suelen ser más precisos que P50. La agrupación por valor de campo puede presentar un margen de error pequeño porque se calcula en paralelo.

  • Es posible combinar varias agregaciones. Sin embargo, una cantidad elevada de agregaciones o un anidamiento profundo incrementan la complejidad de la solicitud y la latencia de respuesta. Para conocer los límites de anidamiento, consulte Search index limits.

En el siguiente ejemplo se consultan todos los datos de un índice de búsqueda. Se calculan el mínimo, el máximo, la suma, el promedio, el conteo de valores no nulos, el conteo de categorías distintas y el P50 de los precios; además, los datos se agrupan por categoría.

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

Solicitud de consulta

Nombre

Tipo

Descripción

TableName (obligatorio)

string

El nombre de la tabla de datos.

IndexName (obligatorio)

string

El nombre del índice de búsqueda.

SearchQuery (obligatorio)

search.SearchQuery

La condición de consulta, las agregaciones de métricas y las configuraciones de agrupación.

ColumnsToGet (opcional)

*tablestore.ColumnsToGet

La configuración de columnas de retorno. Este parámetro solo surte efecto cuando TopRowsAggregation devuelve filas dentro de los grupos. Si lo omite, solo se devuelven las columnas de clave primaria.

RoutingValues (opcional)

[]*tablestore.PrimaryKey

Los valores de clave primaria para los campos de enrutamiento personalizado. Omita este parámetro si no configuró el enrutamiento personalizado.

TimeoutMs (opcional)

*int32

El tiempo de espera de la solicitud en milisegundos.

Configuración de la consulta

Nombre

Tipo

Descripción

SetQuery (obligatorio)

search.Query

Especifica la condición de consulta.

SetOffset (opcional)

int32

Especifica la posición inicial. Valor predeterminado: 0. En la paginación basada en desplazamiento, Offset + Limit no puede superar 100,000.

SetLimit (opcional)

int32

Especifica el número máximo de filas que se devuelven. Valor predeterminado: 10. Valor máximo: 100. Un valor de 0 indica que no se devuelve ninguna fila.

SetCollapse (opcional)

*search.Collapse

Colapsa los resultados de la consulta. Para obtener más información, consulte Collapse query results.

SetSort (opcional)

*search.Sort

Especifica el orden de clasificación de los resultados. Para obtener más información, consulte Sort and paginate results.

SetGetTotalCount (opcional)

bool

Indica si se cuentan todas las filas coincidentes. Valor predeterminado: false.

SetToken (opcional)

[]byte

Especifica el valor NextToken que devolvió la respuesta anterior. Este método borra Sort porque el token contiene las condiciones de ordenación de la página previa. No especifique Offset cuando utilice la paginación basada en tokens.

SetSearchFilter (opcional)

*search.SearchFilter

Aplica un filtro posterior a la consulta. Para obtener más información, consulte Use post-query filters.

Aggregation (opcional)

...search.Aggregation

Configura las agregaciones. Para obtener más información, consulte Aggregation.

GroupBy (opcional)

...search.GroupBy

Configura la agrupación. Para obtener más información, consulte Aggregation.

Agregaciones de métricas

Nombre

Tipo

Descripción

AvgAggregation (opcional)

search.AvgAggregation

Calcula un promedio.

MaxAggregation (opcional)

search.MaxAggregation

Calcula un valor máximo.

MinAggregation (opcional)

search.MinAggregation

Calcula un valor mínimo.

SumAggregation (opcional)

search.SumAggregation

Calcula una suma.

CountAggregation (opcional)

search.CountAggregation

Cuenta los valores no nulos.

DistinctCountAggregation (opcional)

search.DistinctCountAggregation

Cuenta los valores distintos.

PercentilesAggregation (opcional)

search.PercentilesAggregation

Calcula percentiles.

TopRowsAggregation (opcional)

search.TopRowsAggregation

Devuelve las filas principales dentro de un grupo.

MinAggregation, MaxAggregation, AvgAggregation y SumAggregation

Nombre

Tipo

Descripción

AggName (obligatorio)

string

El nombre de la agregación, que identifica el resultado.

Field (obligatorio)

string

El campo de agregación. Min, Max y Avg son compatibles con campos Long, Double y Date. Sum admite campos Long y Double.

MissingValue (opcional)

interface{}

El valor sustituto que se utiliza cuando falta el campo. Si no especifica este parámetro, se ignoran las filas donde falta el campo.

CountAggregation y DistinctCountAggregation

Nombre

Tipo

Descripción

AggName (obligatorio)

string

El nombre de la agregación.

Field (obligatorio)

string

El campo que se va a contar. Son compatibles los campos Long, Double, Boolean, Keyword, Date, IP y Geo-point. El conteo no incluye las filas donde falta el campo.

MissingValue (opcional)

interface{}

Solo compatible con DistinctCountAggregation. Es el valor que se usa para el conteo distinto cuando falta el campo. Si no especifica este parámetro, se ignoran las filas donde falta el campo.

CountAggregation cuenta las filas donde el campo especificado no es nulo, por lo que resulta adecuado para columnas dispersas. Para contar todas las filas que coinciden con una consulta, llame a SetGetTotalCount(true) y lea SearchResponse.TotalCount. Si necesita contar todas las filas de un índice de búsqueda, utilice MatchAllQuery como condición de consulta.

PercentilesAggregation

PercentilesAggregation es compatible con Tablestore SDK for Go 1.7.0 y versiones posteriores.

Nombre

Tipo

Descripción

AggName (obligatorio)

string

El nombre de la agregación.

Field (obligatorio)

string

El campo de agregación. Son compatibles los campos Long, Double y Date.

Percents (obligatorio)

[]float64

Los percentiles que se van a calcular, como 25, 50, 90 y 99.

MissingValue (opcional)

interface{}

El valor sustituto que se utiliza cuando falta el campo. Si no especifica este parámetro, se ignoran las filas donde falta el campo.

TopRowsAggregation

Utilice TopRowsAggregation como subagregación de un grupo. Esta función es compatible con Tablestore SDK for Go 1.7.0 y versiones posteriores.

Nombre

Tipo

Descripción

AggName (obligatorio)

string

El nombre de la agregación.

Limit (opcional)

*int32

El número máximo de filas que se devuelven dentro de cada grupo. Valor predeterminado: 1.

Sort (opcional)

*search.Sort

El orden de clasificación de las filas devueltas.

SearchRequest.ColumnsToGet controla qué columnas de atributos se devuelven. Para devolver columnas de atributos directamente desde el índice de búsqueda, almacene los campos correspondientes cuando cree el índice. Si no especifica las columnas de retorno, solo se devuelven las columnas de clave primaria.

Agrupación

Nombre

Tipo

Descripción

GroupByField (opcional)

search.GroupByField

Agrupa por valor de campo.

GroupByRange (opcional)

search.GroupByRange

Agrupa por rango numérico.

GroupByGeoDistance (opcional)

search.GroupByGeoDistance

Agrupa por distancia geográfica.

GroupByFilter (opcional)

search.GroupByFilter

Agrupa por filtro.

GroupByHistogram (opcional)

search.GroupByHistogram

Agrupa por intervalos numéricos fijos.

GroupByDateHistogram (opcional)

search.GroupByDateHistogram

Agrupa por intervalos de fecha u hora.

GroupByGeoGrid (opcional)

search.GroupByGeoGrid

Agrupa por cuadrícula GeoHash.

GroupByComposite (opcional)

search.GroupByComposite

Agrupa mediante una clave compuesta de varios campos y admite paginación.

GroupByField

Nombre

Tipo

Descripción

AggName (obligatorio)

string

El nombre del grupo.

Field (obligatorio)

string

El campo de agrupación. Son compatibles los campos Long, Double, Boolean, Keyword, Date e IP.

Sz (opcional)

*int32

El número de grupos que se devuelven. Valor predeterminado: 10. Valor máximo: 2,000.

Sorters (opcional)

[]search.GroupBySorter

El orden de clasificación de los grupos. Cuando hay varios clasificadores, se aplican en el orden de la lista. De forma predeterminada, los grupos se ordenan por conteo de filas en orden descendente.

SubAggList (opcional)

[]search.Aggregation

Las subagregaciones.

SubGroupByList (opcional)

[]search.GroupBy

Los subgrupos.

Clasificación de grupos

Se admiten los siguientes tipos de clasificación de grupos:

  • GroupKeyGroupBySort: Ordena las claves de grupo en orden léxico ascendente o descendente.

  • RowCountGroupBySort: Ordena por el conteo de filas del grupo en orden ascendente o descendente. El orden descendente por conteo de filas es el predeterminado.

  • SubAggGroupBySort: Ordena según el resultado de la subagregación especificada en orden ascendente o descendente.

GroupByRange

Nombre

Tipo

Descripción

AggName (obligatorio)

string

El nombre del grupo.

Field (obligatorio)

string

El campo de agrupación. Son compatibles los campos Long y Double.

RangeList (obligatorio)

[]search.Range

Los rangos de agrupación cerrados por la izquierda y abiertos por la derecha. Los límites pueden usar search.NegInf y search.Inf.

SubAggList (opcional)

[]search.Aggregation

Las subagregaciones.

SubGroupByList (opcional)

[]search.GroupBy

Los subgrupos.

GroupByGeoDistance

Nombre

Tipo

Descripción

AggName (obligatorio)

string

El nombre del grupo.

Field (obligatorio)

string

El campo de agrupación. Solo son compatibles los campos Geo-point.

Origin (obligatorio)

search.GeoPoint

La coordenada central en el orden latitud-longitud. La latitud varía de -90 a +90 y la longitud de -180 a +180.

RangeList (obligatorio)

[]search.Range

Los rangos de distancia en metros, cerrados por la izquierda y abiertos por la derecha. Los límites pueden usar search.NegInf y search.Inf.

SubAggList (opcional)

[]search.Aggregation

Las subagregaciones.

SubGroupByList (opcional)

[]search.GroupBy

Los subgrupos.

GroupByFilter

Nombre

Tipo

Descripción

AggName (obligatorio)

string

El nombre del grupo.

Queries (obligatorio)

[]search.Query

Los filtros. El orden de los resultados coincide con el orden de las condiciones de consulta.

SubAggList (opcional)

[]search.Aggregation

Las subagregaciones.

SubGroupByList (opcional)

[]search.GroupBy

Los subgrupos.

GroupByHistogram

Nombre

Tipo

Descripción

GroupByName (obligatorio)

string

El nombre del grupo.

Field (obligatorio)

string

El campo de agrupación. Son compatibles los campos Long y Double.

Interval (obligatorio)

interface{}

El intervalo numérico de agrupación.

FieldRange (opcional)

model.FiledRange

El rango de valores de campo que se incluye en la agrupación. Si lo configura, (Max - Min) / Interval no puede superar 2,000.

Missing (opcional)

interface{}

El valor de grupo que se utiliza cuando falta el campo. Si no especifica este parámetro, se ignoran las filas donde falta el campo.

MinDocCount (opcional)

*int64

El número mínimo de filas necesario para que se devuelva un grupo.

Sorters (opcional)

[]search.GroupBySorter

El orden de clasificación de los grupos.

SubAggList (opcional)

[]search.Aggregation

Las subagregaciones.

SubGroupByList (opcional)

[]search.GroupBy

Los subgrupos.

GroupByDateHistogram

GroupByDateHistogram es compatible con Tablestore SDK for Go 1.7.10 y versiones posteriores.

Nombre

Tipo

Descripción

GroupByName (obligatorio)

string

El nombre del grupo.

Field (obligatorio)

string

El campo de agrupación. Solo son compatibles los campos Date.

Interval (obligatorio)

model.DateTimeValue

El intervalo de fecha u hora, compuesto por un valor y una unidad de tiempo.

FieldRange (opcional)

model.FiledRange

El rango de valores de campo que se incluye en la agrupación. Si lo configura, (Max - Min) / Interval no puede superar 2,000.

Missing (opcional)

interface{}

El valor de grupo de fecha que se utiliza cuando falta el campo. Si no especifica este parámetro, se ignoran las filas donde falta el campo.

MinDocCount (opcional)

*int64

El número mínimo de filas necesario para que se devuelva un grupo.

TimeZone (opcional)

*string

Utilice el formato +hh:mm o -hh:mm, como +08:00. Si el formato del campo Date no incluye una zona horaria, establezca este parámetro para evitar desfases de tiempo en los resultados de la agregación.

Sorters (opcional)

[]search.GroupBySorter

El orden de clasificación de los grupos.

SubAggList (opcional)

[]search.Aggregation

Las subagregaciones.

SubGroupByList (opcional)

[]search.GroupBy

Los subgrupos.

GroupByGeoGrid

GroupByGeoGrid es compatible con Tablestore SDK for Go 1.7.12 y versiones posteriores.

Nombre

Tipo

Descripción

GroupByName (obligatorio)

string

El nombre del grupo.

Field (obligatorio)

string

El campo Geo-point.

Precision (obligatorio)

model.GeoHashPrecision

La precisión de la cuadrícula GeoHash. Un ordinal de enumeración mayor representa una cuadrícula más pequeña.

Size (obligatorio)

int64

El número de grupos de cuadrícula que se devuelven.

SubAggList (opcional)

[]search.Aggregation

Las subagregaciones.

SubGroupByList (opcional)

[]search.GroupBy

Los subgrupos.

GroupByComposite

GroupByComposite es compatible con Tablestore SDK for Go 1.7.15 y versiones posteriores.

Nombre

Tipo

Descripción

GroupByName (obligatorio)

string

El nombre del grupo.

SourceGroupByList (obligatorio)

[]search.GroupBy

Los orígenes del grupo compuesto. Se admiten hasta 32 campos. Los tipos de origen válidos son GroupByField, GroupByHistogram y GroupByDateHistogram. Un origen GroupByField solo utiliza su nombre, campo y clasificadores. Un origen GroupByHistogram solo emplea su nombre, campo, intervalo y clasificadores. Un origen GroupByDateHistogram también puede usar TimeZone. Los orígenes solo admiten la clasificación por clave de grupo, en orden descendente de forma predeterminada. Si un valor de campo no existe, la clave correspondiente es null.

Size (opcional)

*int32

El número de claves compuestas que se devuelven. Valor predeterminado: 10. Valor máximo: 2,000. No especifique este parámetro junto con SuggestedSize.

SuggestedSize (opcional)

*int32

Un límite flexible para escenarios de alto rendimiento, como Spark y Presto. Puede especificar -1 o un valor superior al límite del servidor. El número real que se devuelve es min(SuggestedSize, server group limit, total groups). No especifique este parámetro junto con Size.

NextToken (opcional)

*string

El token de paginación que devolvió el resultado del grupo anterior.

SubAggList (opcional)

[]search.Aggregation

Las subagregaciones.

SubGroupByList (opcional)

[]search.GroupBy

Los subgrupos. GroupByComposite no se puede utilizar como subgrupo de otro grupo.

Respuesta

Lea los resultados de las métricas por nombre de agregación desde SearchResponse.AggregationResults y los resultados de agrupación por nombre de grupo desde SearchResponse.GroupByResults.

Resultados de agregación de métricas

Nombre

Tipo

Descripción

Avg, Max, Min, Sum

Value float64

Llame a AggregationResults.Avg, Max, Min o Sum con el nombre de la agregación y lea Value del objeto devuelto. Para Avg, Max y Min, llame a HasValue para determinar si el resultado contiene un valor válido.

Count, DistinctCount

Value int64

Llame a AggregationResults.Count o DistinctCount con el nombre de la agregación y lea Value del objeto devuelto.

Percentiles

PercentilesAggregationItems []search.PercentilesAggregationItem

Llame a AggregationResults.Percentiles con el nombre de la agregación. En cada elemento, Key es el percentil y Value es el valor correspondiente.

TopRows

Value []model.Row

Llame a AggregationResults.TopRows con el nombre de la agregación y lea Value del objeto devuelto.

Resultados de agrupación

Nombre

Tipo

Descripción

GroupByField

[]search.GroupByFieldResultItem

Llame a GroupByResults.GroupByField. Cada elemento contiene Key, RowCount, SubAggregations y SubGroupBys.

GroupByRange

[]search.GroupByRangeResultItem

Llame a GroupByResults.GroupByRange. Cada elemento contiene From, To, RowCount, SubAggregations y SubGroupBys.

GroupByGeoDistance

[]search.GroupByGeoDistanceResultItem

Llame a GroupByResults.GroupByGeoDistance. Cada elemento contiene los límites de distancia From y To, RowCount, SubAggregations y SubGroupBys.

GroupByFilter

[]search.GroupByFilterResultItem

Llame a GroupByResults.GroupByFilter. El orden de los resultados coincide con Queries. Cada elemento contiene RowCount, SubAggregations y SubGroupBys.

GroupByHistogram

[]search.GroupByHistogramItem

Llame a GroupByResults.GroupByHistogram. En cada elemento, Key es el valor del bucket y Value es el conteo de filas. Cada elemento también contiene SubAggregations y SubGroupBys.

GroupByDateHistogram

[]search.GroupByDateHistogramItem

Llame a GroupByResults.GroupByDateHistogram. Cada elemento contiene la marca de tiempo en milisegundos Timestamp, RowCount, SubAggregations y SubGroupBys.

GroupByGeoGrid

[]search.GroupByGeoGridResultItem

Llame a GroupByResults.GroupByGeoGrid. Cada elemento contiene la clave GeoHash Key, los límites de GeoGrid, RowCount, SubAggregations y SubGroupBys.

GroupByComposite

[]search.GroupByCompositeResultItem

Llame a GroupByResults.GroupByComposite. SourceGroupByNames especifica el orden de las claves. Las claves de cada elemento corresponden a ese orden. Cada elemento también contiene RowCount, SubAggregations y SubGroupBys. NextToken es el token para la página siguiente.

Ejemplos

Uso de subagregaciones y subgrupos

En el siguiente ejemplo se agrupan las filas por categoría, se calcula el precio máximo en cada una y luego se vuelven a agrupar por estado.

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

Agrupación por varios campos y paginación de resultados

GroupByComposite devuelve los resultados de agrupación de varios campos como claves compuestas planas y utiliza NextToken para leer los grupos siguientes.

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

Agrupación por rango, distancia y filtro

En el siguiente ejemplo se agrupan los resultados por rango de precios, distancia geográfica y filtro dentro de la misma 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)

Generación de histogramas numéricos y de fechas

En el siguiente ejemplo se genera un histograma numérico con intervalos de precios fijos y un histograma mensual de fechas.

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)

Agrupación por cuadrícula geográfica

En el siguiente ejemplo se agrupa un campo geográfico mediante cuadrículas 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)

Recuperación de filas dentro de los grupos

En el siguiente ejemplo se agrupan las filas por categoría y se devuelve la fila con el precio más alto de cada una.

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

Comparación de métodos de agrupación por varios campos

Para agrupar por varios campos, anide varios valores GroupByField o utilice GroupByComposite. Elija el método según la estructura de los resultados, los requisitos de ordenación y la necesidad de paginación.

Método

Características

GroupByField anidado

Devuelve grupos jerárquicos padre-hijo. Cada nivel devuelve hasta 2,000 grupos. No admite paginación de grupos. Admite la clasificación por clave de grupo, conteo de filas o valor de subagregación, así como subagregaciones.

GroupByComposite

Devuelve claves compuestas planas para un máximo de 32 campos. Cada página devuelve hasta 2,000 grupos y admite paginación con NextToken. Cada origen solo permite la clasificación por clave de grupo, en orden descendente de forma predeterminada. Una clave de grupo Date se devuelve como una cadena de marca de tiempo.