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