Tous les produits
Search
Centre de documentation

Tablestore:Agrégation

Dernière mise à jour :Sep 14, 2026

Utilisez le SDK Tablestore pour Go afin de calculer des métriques ou de regrouper les résultats d'une requête sur un index de recherche.

Prérequis

Installez le SDK Tablestore pour Go et initialisez un client.

Description

L'agrégation permet de calculer des moyennes, des maximums, des minimums, des sommes, des comptes, des comptes distincts, des percentiles ou de récupérer les lignes les plus pertinentes à partir des résultats d'une requête. Les résultats peuvent également être regroupés par champs, plages, dates, emplacements géographiques, filtres ou clés composites. Le tri et l'agrégation doivent être activés pour les champs utilisés dans les agrégations de métriques ou le regroupement basé sur les champs, les plages ou les histogrammes. Les filtres dans GroupByFilter respectent les exigences de champ du type de requête correspondant.

Important
  • Les comptes distincts, les percentiles et le regroupement par valeur de champ utilisent des calculs approximatifs. Un compte distinct inférieur à 10 000 est proche de la valeur exacte, et l'erreur est d'environ 2 % pour 100 millions d'éléments. Les percentiles proches des extrémités, tels que P1 et P99, sont généralement plus précis que P50. Le regroupement par valeur de champ peut présenter une petite erreur car il est calculé en parallèle.

  • Vous pouvez combiner plusieurs agrégations. Un grand nombre d'agrégations ou une imbrication profonde augmente la complexité de la requête et la latence de la réponse. Pour connaître les limites d'imbrication, consultez les Limites de l'index de recherche.

L'exemple suivant interroge toutes les données d'un index de recherche, calcule le prix minimum, maximum, la somme, la moyenne, le nombre de valeurs non nulles, le nombre de catégories distinctes et le percentile P50 des prix, puis regroupe les données par catégorie.

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)

Paramètres

Requête de recherche

Nom

Type

Description

TableName (obligatoire)

string

Nom de la table de données.

IndexName (obligatoire)

string

Nom de l'index de recherche.

SearchQuery (obligatoire)

search.SearchQuery

Condition de requête, agrégations de métriques et configurations de regroupement.

ColumnsToGet (facultatif)

*tablestore.ColumnsToGet

Configuration des colonnes à renvoyer. Ce paramètre prend effet uniquement lorsque TopRowsAggregation renvoie des lignes au sein des groupes. S'il est omis, seules les colonnes de clé primaire sont renvoyées.

RoutingValues (facultatif)

[]*tablestore.PrimaryKey

Valeurs de clé primaire pour les champs de routage personnalisé. Omettez ce paramètre si le routage personnalisé n'est pas configuré.

TimeoutMs (facultatif)

*int32

Délai d'expiration de la requête en millisecondes.

Configuration de la requête

Nom

Type

Description

SetQuery (obligatoire)

search.Query

Spécifie la condition de requête.

SetOffset (facultatif)

int32

Spécifie la position de départ. Valeur par défaut : 0. Pour la pagination basée sur le décalage, Offset + Limit ne peut pas dépasser 100 000.

SetLimit (facultatif)

int32

Spécifie le nombre maximal de lignes à renvoyer. Valeur par défaut : 10. Valeur maximale : 100. Une valeur de 0 ne renvoie aucune ligne.

SetCollapse (facultatif)

*search.Collapse

Regroupe les résultats de la requête. Pour plus d'informations, consultez la section Regrouper les résultats de la requête.

SetSort (facultatif)

*search.Sort

Spécifie l'ordre de tri des résultats. Pour plus d'informations, consultez la section Trier et paginer les résultats.

SetGetTotalCount (facultatif)

bool

Indique s'il faut compter toutes les lignes correspondantes. Valeur par défaut : false.

SetToken (facultatif)

[]byte

Spécifie la valeur NextToken renvoyée par la réponse précédente. Cette méthode efface Sort car le jeton contient les conditions de tri de la page précédente. Ne spécifiez pas Offset lorsque vous utilisez la pagination basée sur un jeton.

SetSearchFilter (facultatif)

*search.SearchFilter

Applique un filtre post-requête. Pour plus d'informations, consultez la section Utiliser des filtres post-requête.

Aggregation (facultatif)

...search.Aggregation

Configure les agrégations. Pour plus d'informations, consultez la section Agrégation.

GroupBy (facultatif)

...search.GroupBy

Configure le regroupement. Pour plus d'informations, consultez la section Agrégation.

Agrégations de métriques

Nom

Type

Description

AvgAggregation (facultatif)

search.AvgAggregation

Calcule une moyenne.

MaxAggregation (facultatif)

search.MaxAggregation

Calcule un maximum.

MinAggregation (facultatif)

search.MinAggregation

Calcule un minimum.

SumAggregation (facultatif)

search.SumAggregation

Calcule une somme.

CountAggregation (facultatif)

search.CountAggregation

Compte les valeurs non nulles.

DistinctCountAggregation (facultatif)

search.DistinctCountAggregation

Compte les valeurs distinctes.

PercentilesAggregation (facultatif)

search.PercentilesAggregation

Calcule les percentiles.

TopRowsAggregation (facultatif)

search.TopRowsAggregation

Renvoie les lignes les plus pertinentes au sein d'un groupe.

MinAggregation, MaxAggregation, AvgAggregation et SumAggregation

Nom

Type

Description

AggName (obligatoire)

string

Nom de l'agrégation, qui identifie le résultat.

Field (obligatoire)

string

Champ d'agrégation. Min, Max et Avg prennent en charge les champs Long, Double et Date. Sum prend en charge les champs Long et Double.

MissingValue (facultatif)

interface{}

Valeur de substitution utilisée lorsque le champ est manquant. Si ce paramètre n'est pas spécifié, les lignes où le champ est manquant sont ignorées.

CountAggregation et DistinctCountAggregation

Nom

Type

Description

AggName (obligatoire)

string

Nom de l'agrégation.

Field (obligatoire)

string

Champ à compter. Les champs Long, Double, Boolean, Keyword, Date, IP et Geo-point sont pris en charge. Count n'inclut pas les lignes où le champ est manquant.

MissingValue (facultatif)

interface{}

Pris en charge uniquement par DistinctCountAggregation. La valeur est utilisée pour le comptage distinct lorsque le champ est manquant. Si ce paramètre n'est pas spécifié, les lignes où le champ est manquant sont ignorées.

CountAggregation compte les lignes où le champ spécifié n'est pas nul et convient aux colonnes clairsemées. Pour compter toutes les lignes correspondant à une requête, appelez SetGetTotalCount(true) et lisez SearchResponse.TotalCount. Pour compter toutes les lignes d'un index de recherche, utilisez MatchAllQuery comme condition de requête.

PercentilesAggregation

PercentilesAggregation est pris en charge par le SDK Tablestore pour Go version 1.7.0 et ultérieures.

Nom

Type

Description

AggName (obligatoire)

string

Nom de l'agrégation.

Field (obligatoire)

string

Champ d'agrégation. Les champs Long, Double et Date sont pris en charge.

Percents (obligatoire)

[]float64

Percentiles à calculer, tels que 25, 50, 90 et 99.

MissingValue (facultatif)

interface{}

Valeur de substitution utilisée lorsque le champ est manquant. Si ce paramètre n'est pas spécifié, les lignes où le champ est manquant sont ignorées.

TopRowsAggregation

Utilisez TopRowsAggregation comme sous-agrégation d'un groupe. Cette fonctionnalité est prise en charge par le SDK Tablestore pour Go version 1.7.0 et ultérieures.

Nom

Type

Description

AggName (obligatoire)

string

Nom de l'agrégation.

Limit (facultatif)

*int32

Nombre maximal de lignes renvoyées au sein de chaque groupe. Valeur par défaut : 1.

Sort (facultatif)

*search.Sort

Ordre de tri des lignes renvoyées.

SearchRequest.ColumnsToGet contrôle les colonnes d'attribut renvoyées. Pour renvoyer directement les colonnes d'attribut depuis l'index de recherche, stockez les champs correspondants lors de la création de l'index. Si les colonnes de retour ne sont pas spécifiées, seules les colonnes de clé primaire sont renvoyées.

Regroupement

Nom

Type

Description

GroupByField (facultatif)

search.GroupByField

Regroupe par valeur de champ.

GroupByRange (facultatif)

search.GroupByRange

Regroupe par plage numérique.

GroupByGeoDistance (facultatif)

search.GroupByGeoDistance

Regroupe par distance géographique.

GroupByFilter (facultatif)

search.GroupByFilter

Regroupe par filtre.

GroupByHistogram (facultatif)

search.GroupByHistogram

Regroupe par intervalles numériques fixes.

GroupByDateHistogram (facultatif)

search.GroupByDateHistogram

Regroupe par intervalles de date ou d'heure.

GroupByGeoGrid (facultatif)

search.GroupByGeoGrid

Regroupe par grille GeoHash.

GroupByComposite (facultatif)

search.GroupByComposite

Regroupe par une clé composite de plusieurs champs et prend en charge la pagination.

GroupByField

Nom

Type

Description

AggName (obligatoire)

string

Nom du groupe.

Field (obligatoire)

string

Champ de regroupement. Les champs Long, Double, Boolean, Keyword, Date et IP sont pris en charge.

Sz (facultatif)

*int32

Nombre de groupes à renvoyer. Valeur par défaut : 10. Valeur maximale : 2 000.

Sorters (facultatif)

[]search.GroupBySorter

Ordre de tri des groupes. Plusieurs trieurs s'appliquent dans l'ordre de la liste. Par défaut, les groupes sont triés par nombre de lignes dans l'ordre décroissant.

SubAggList (facultatif)

[]search.Aggregation

Sous-agrégations.

SubGroupByList (facultatif)

[]search.GroupBy

Sous-groupes.

Tri des groupes

Les types de tri de groupe suivants sont pris en charge :

  • GroupKeyGroupBySort : Trie les clés de groupe par ordre lexical croissant ou décroissant.

  • RowCountGroupBySort : Trie par nombre de lignes du groupe dans l'ordre croissant ou décroissant. L'ordre décroissant du nombre de lignes est la valeur par défaut.

  • SubAggGroupBySort : Trie par le résultat de la sous-agrégation spécifiée dans l'ordre croissant ou décroissant.

GroupByRange

Nom

Type

Description

AggName (obligatoire)

string

Nom du groupe.

Field (obligatoire)

string

Champ de regroupement. Les champs Long et Double sont pris en charge.

RangeList (obligatoire)

[]search.Range

Plages de groupe fermées à gauche et ouvertes à droite. Les bornes peuvent utiliser search.NegInf et search.Inf.

SubAggList (facultatif)

[]search.Aggregation

Sous-agrégations.

SubGroupByList (facultatif)

[]search.GroupBy

Sous-groupes.

GroupByGeoDistance

Nom

Type

Description

AggName (obligatoire)

string

Nom du groupe.

Field (obligatoire)

string

Champ de regroupement. Seuls les champs Geo-point sont pris en charge.

Origin (obligatoire)

search.GeoPoint

Coordonnée centrale dans l'ordre latitude-longitude. La latitude varie de -90 à +90 et la longitude de -180 à +180.

RangeList (obligatoire)

[]search.Range

Plages de distance fermées à gauche et ouvertes à droite en mètres. Les bornes peuvent utiliser search.NegInf et search.Inf.

SubAggList (facultatif)

[]search.Aggregation

Sous-agrégations.

SubGroupByList (facultatif)

[]search.GroupBy

Sous-groupes.

GroupByFilter

Nom

Type

Description

AggName (obligatoire)

string

Nom du groupe.

Queries (obligatoire)

[]search.Query

Filtres. L'ordre des résultats correspond à l'ordre des conditions de requête.

SubAggList (facultatif)

[]search.Aggregation

Sous-agrégations.

SubGroupByList (facultatif)

[]search.GroupBy

Sous-groupes.

GroupByHistogram

Nom

Type

Description

GroupByName (obligatoire)

string

Nom du groupe.

Field (obligatoire)

string

Champ de regroupement. Les champs Long et Double sont pris en charge.

Interval (obligatoire)

interface{}

Intervalle numérique du groupe.

FieldRange (facultatif)

model.FiledRange

Plage de valeurs de champ incluse dans le regroupement. Si configuré, (Max - Min) / Interval ne peut pas dépasser 2 000.

Missing (facultatif)

interface{}

Valeur de groupe utilisée lorsque le champ est manquant. Si ce paramètre n'est pas spécifié, les lignes où le champ est manquant sont ignorées.

MinDocCount (facultatif)

*int64

Nombre minimal de lignes requis pour qu'un groupe soit renvoyé.

Sorters (facultatif)

[]search.GroupBySorter

Ordre de tri des groupes.

SubAggList (facultatif)

[]search.Aggregation

Sous-agrégations.

SubGroupByList (facultatif)

[]search.GroupBy

Sous-groupes.

GroupByDateHistogram

GroupByDateHistogram est pris en charge par le SDK Tablestore pour Go version 1.7.10 et ultérieures.

Nom

Type

Description

GroupByName (obligatoire)

string

Nom du groupe.

Field (obligatoire)

string

Champ de regroupement. Seuls les champs Date sont pris en charge.

Interval (obligatoire)

model.DateTimeValue

Intervalle de date ou d'heure, composé d'une valeur et d'une unité de temps.

FieldRange (facultatif)

model.FiledRange

Plage de valeurs de champ incluse dans le regroupement. Si configuré, (Max - Min) / Interval ne peut pas dépasser 2 000.

Missing (facultatif)

interface{}

Valeur de groupe de date utilisée lorsque le champ est manquant. Si ce paramètre n'est pas spécifié, les lignes où le champ est manquant sont ignorées.

MinDocCount (facultatif)

*int64

Nombre minimal de lignes requis pour qu'un groupe soit renvoyé.

TimeZone (facultatif)

*string

Utilisez le format +hh:mm ou -hh:mm, tel que +08:00. Si le format du champ Date ne contient pas de fuseau horaire, définissez ce paramètre pour éviter un décalage horaire dans les résultats d'agrégation.

Sorters (facultatif)

[]search.GroupBySorter

Ordre de tri des groupes.

SubAggList (facultatif)

[]search.Aggregation

Sous-agrégations.

SubGroupByList (facultatif)

[]search.GroupBy

Sous-groupes.

GroupByGeoGrid

GroupByGeoGrid est pris en charge par le SDK Tablestore pour Go version 1.7.12 et ultérieures.

Nom

Type

Description

GroupByName (obligatoire)

string

Nom du groupe.

Field (obligatoire)

string

Champ Geo-point.

Precision (obligatoire)

model.GeoHashPrecision

Précision de la grille GeoHash. Un ordinal d'énumération plus élevé représente une grille plus petite.

Size (obligatoire)

int64

Nombre de groupes de grille à renvoyer.

SubAggList (facultatif)

[]search.Aggregation

Sous-agrégations.

SubGroupByList (facultatif)

[]search.GroupBy

Sous-groupes.

GroupByComposite

GroupByComposite est pris en charge par le SDK Tablestore pour Go version 1.7.15 et ultérieures.

Nom

Type

Description

GroupByName (obligatoire)

string

Nom du groupe.

SourceGroupByList (obligatoire)

[]search.GroupBy

Sources de groupe composite. Jusqu'à 32 champs sont pris en charge. Les types de source valides sont GroupByField, GroupByHistogram et GroupByDateHistogram. Une source GroupByField utilise uniquement son nom, son champ et ses trieurs. Une source GroupByHistogram utilise uniquement son nom, son champ, son intervalle et ses trieurs. Une source GroupByDateHistogram peut également utiliser TimeZone. Les sources prennent en charge uniquement le tri par clé de groupe, par défaut dans l'ordre décroissant. Si une valeur de champ n'existe pas, la clé correspondante est nulle.

Size (facultatif)

*int32

Nombre de clés composites à renvoyer. Valeur par défaut : 10. Valeur maximale : 2 000. Ne spécifiez pas ce paramètre conjointement avec SuggestedSize.

SuggestedSize (facultatif)

*int32

Limite souple pour les scénarios à haut débit tels que Spark et Presto. Vous pouvez spécifier -1 ou une valeur supérieure à la limite du serveur. Le nombre réel renvoyé est min(SuggestedSize, limite de groupe du serveur, total des groupes). Ne spécifiez pas ce paramètre conjointement avec Size.

NextToken (facultatif)

*string

Jeton de pagination renvoyé par le résultat de groupe précédent.

SubAggList (facultatif)

[]search.Aggregation

Sous-agrégations.

SubGroupByList (facultatif)

[]search.GroupBy

Sous-groupes. GroupByComposite lui-même ne peut pas être utilisé comme sous-groupe d'un autre groupe.

Réponse

Lisez les résultats des métriques par nom d'agrégation depuis SearchResponse.AggregationResults et les résultats de regroupement par nom de groupe depuis SearchResponse.GroupByResults.

Résultats des agrégations de métriques

Nom

Type

Description

Avg, Max, Min, Sum

Value float64

Appelez AggregationResults.Avg, Max, Min ou Sum avec le nom de l'agrégation et lisez Value à partir de l'objet renvoyé. Pour Avg, Max et Min, appelez HasValue pour déterminer si le résultat contient une valeur valide.

Count, DistinctCount

Value int64

Appelez AggregationResults.Count ou DistinctCount avec le nom de l'agrégation et lisez Value à partir de l'objet renvoyé.

Percentiles

PercentilesAggregationItems []search.PercentilesAggregationItem

Appelez AggregationResults.Percentiles avec le nom de l'agrégation. Dans chaque élément, Key est le percentile et Value est la valeur correspondante.

TopRows

Value []model.Row

Appelez AggregationResults.TopRows avec le nom de l'agrégation et lisez Value à partir de l'objet renvoyé.

Résultats de regroupement

Nom

Type

Description

GroupByField

[]search.GroupByFieldResultItem

Appelez GroupByResults.GroupByField. Chaque élément contient Key, RowCount, SubAggregations et SubGroupBys.

GroupByRange

[]search.GroupByRangeResultItem

Appelez GroupByResults.GroupByRange. Chaque élément contient From, To, RowCount, SubAggregations et SubGroupBys.

GroupByGeoDistance

[]search.GroupByGeoDistanceResultItem

Appelez GroupByResults.GroupByGeoDistance. Chaque élément contient les bornes de distance From et To, RowCount, SubAggregations et SubGroupBys.

GroupByFilter

[]search.GroupByFilterResultItem

Appelez GroupByResults.GroupByFilter. L'ordre des résultats correspond à Queries. Chaque élément contient RowCount, SubAggregations et SubGroupBys.

GroupByHistogram

[]search.GroupByHistogramItem

Appelez GroupByResults.GroupByHistogram. Dans chaque élément, Key est la valeur du compartiment et Value est le nombre de lignes. Chaque élément contient également SubAggregations et SubGroupBys.

GroupByDateHistogram

[]search.GroupByDateHistogramItem

Appelez GroupByResults.GroupByDateHistogram. Chaque élément contient l'horodatage en millisecondes Timestamp, RowCount, SubAggregations et SubGroupBys.

GroupByGeoGrid

[]search.GroupByGeoGridResultItem

Appelez GroupByResults.GroupByGeoGrid. Chaque élément contient la clé GeoHash Key, les bornes GeoGrid, RowCount, SubAggregations et SubGroupBys.

GroupByComposite

[]search.GroupByCompositeResultItem

Appelez GroupByResults.GroupByComposite. SourceGroupByNames spécifie l'ordre des clés. Les clés de chaque élément correspondent à cet ordre. Chaque élément contient également RowCount, SubAggregations et SubGroupBys. NextToken est le jeton pour la page suivante.

Exemples

Utiliser des sous-agrégations et des sous-groupes

L'exemple suivant regroupe les lignes par catégorie, calcule le prix maximum dans chaque catégorie et regroupe ensuite les lignes par statut.

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

Regrouper par plusieurs champs et paginer les résultats

GroupByComposite renvoie les résultats de regroupement multi-champs sous forme de clés composites plates et utilise NextToken pour lire les groupes suivants.

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

Regrouper par plage, distance et filtre

L'exemple suivant regroupe les résultats par plage de prix, distance géographique et filtre dans la même requête.

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)

Générer des histogrammes numériques et de date

L'exemple suivant génère un histogramme numérique en utilisant des intervalles de prix fixes et un histogramme de date mensuel.

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)

Regrouper par grille géographique

L'exemple suivant regroupe un champ géographique par grilles GeoHash d'environ 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)

Récupérer les lignes au sein des groupes

L'exemple suivant regroupe les lignes par catégorie et renvoie la ligne avec le prix le plus élevé dans chaque catégorie.

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

Comparer les méthodes de regroupement multi-champs

Pour regrouper par plusieurs champs, imbriquez plusieurs valeurs GroupByField ou utilisez GroupByComposite. Choisissez en fonction de la structure des résultats, des exigences de tri et de la nécessité d'une pagination.

Méthode

Caractéristiques

GroupByField imbriqué

Renvoie des groupes hiérarchiques parent-enfant. Chaque niveau renvoie jusqu'à 2 000 groupes. La pagination des groupes n'est pas prise en charge. Le tri par clé de groupe, nombre de lignes ou valeur de sous-agrégation et les sous-agrégations sont pris en charge.

GroupByComposite

Renvoie des clés composites plates pour jusqu'à 32 champs. Chaque page renvoie jusqu'à 2 000 groupes et prend en charge la pagination NextToken. Chaque source prend en charge uniquement le tri par clé de groupe et utilise par défaut l'ordre décroissant. Une clé de groupe Date est renvoyée sous forme de chaîne d'horodatage.