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