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