Le type de request est SearchRequest. Le tableau suivant décrit ses paramètres.
|
Nom |
Type |
Description |
|
tableName (obligatoire) |
String |
Nom de la table de données. |
|
indexName (obligatoire) |
String |
Nom de l'index de recherche. |
|
searchQuery (obligatoire) |
SearchQuery |
Condition de recherche et configurations d'agrégation. |
|
columnsToGet (facultatif) |
SearchRequest.ColumnsToGet |
Colonnes à renvoyer. Ce paramètre s'applique uniquement lorsque |
|
timeoutInMillisecond (facultatif) |
int |
Délai d'expiration de la requête au niveau de la demande, en millisecondes. Valeur par défaut : |
|
routingValues (facultatif) |
|
Valeurs de clé primaire pour les champs de routage personnalisé. Vous n'avez pas besoin de configurer ce paramètre si le routage personnalisé n'est pas utilisé. |
Configuration de la recherche
Le type de request.searchQuery est SearchQuery. Le tableau suivant décrit les paramètres liés à l'agrégation.
|
Nom |
Type |
Description |
|
query (obligatoire) |
Query |
Condition de recherche qui détermine la portée de l'agrégation. Pour agréger toutes les lignes d'un index de recherche, utilisez |
|
aggregationList (facultatif) |
|
Configurations d'agrégation de métriques. Configurez au moins l'un de ces paramètres ou |
|
groupByList (facultatif) |
|
Configurations de regroupement. Configurez au moins l'un de ces paramètres ou |
|
limit (facultatif) |
Integer |
Nombre maximal de lignes à renvoyer. Valeur par défaut : |
|
offset (facultatif) |
Integer |
Position de la ligne à partir de laquelle la recherche commence. Valeur par défaut : |
|
sort (facultatif) |
Sort |
Ordre de tri des résultats de la recherche. Ce paramètre ne modifie pas la portée des agrégations de métriques ni des regroupements standards. |
|
trackTotalCount (facultatif) |
int |
Nombre maximal attendu de correspondances à compter. Si ce paramètre est défini sur |
|
filter (facultatif) |
SearchFilter |
Filtre appliqué aux résultats de |
Agrégations de métriques
Ajoutez les objets de paramètres suivants à request.searchQuery.aggregationList[]. aggName identifie le résultat correspondant et doit être unique dans une requête.
MinAggregation, MaxAggregation et AvgAggregation
|
Nom |
Type |
Description |
|
aggName (obligatoire) |
String |
Nom de l'agrégation. |
|
fieldName (obligatoire) |
String |
Nom du champ d'agrégation. Les champs Long, Double et Date sont pris en charge. |
|
missing (facultatif) |
ColumnValue |
Valeur utilisée si |
SumAggregation
|
Nom |
Type |
Description |
|
aggName (obligatoire) |
String |
Nom de l'agrégation. |
|
fieldName (obligatoire) |
String |
Nom du champ d'agrégation. Les champs Long et Double sont pris en charge. |
|
missing (facultatif) |
ColumnValue |
Valeur utilisée dans la somme si |
CountAggregation
|
Nom |
Type |
Description |
|
aggName (obligatoire) |
String |
Nom de l'agrégation. |
|
fieldName (obligatoire) |
String |
Champ dont les valeurs non nulles sont comptées. Les champs Long, Double, Boolean, Keyword, Date, IP et Geo-point sont pris en charge. Les lignes d'une colonne sparse ne contenant pas le champ ne sont pas comptées. |
Pour compter toutes les correspondances de la recherche, configurez trackTotalCount dans SearchQuery et lisez SearchResponse.totalCount. Pour compter toutes les lignes d'un index de recherche, utilisez MatchAllQuery.
DistinctCountAggregation
|
Nom |
Type |
Description |
|
aggName (obligatoire) |
String |
Nom de l'agrégation. |
|
fieldName (obligatoire) |
String |
Champ dont les valeurs distinctes sont comptées. Les champs Long, Double, Boolean, Keyword, Date, IP et Geo-point sont pris en charge. |
|
missing (facultatif) |
ColumnValue |
Valeur utilisée pour le compte distinct si |
PercentilesAggregation
|
Nom |
Type |
Description |
|
aggName (obligatoire) |
String |
Nom de l'agrégation. |
|
fieldName (obligatoire) |
String |
Nom du champ d'agrégation. Les champs Long, Double et Date sont pris en charge. |
|
percentiles (obligatoire) |
|
Percentiles à calculer, tels que |
|
missing (facultatif) |
ColumnValue |
Valeur utilisée dans le calcul des percentiles si |
TopRowsAggregation
Utilisez TopRowsAggregation comme sous-agrégation d'un regroupement.
|
Nom |
Type |
Description |
|
aggName (obligatoire) |
String |
Nom de l'agrégation. |
|
limit (facultatif) |
Integer |
Nombre maximal de lignes à renvoyer pour chaque groupe. Valeur par défaut : |
|
sort (facultatif) |
Sort |
Ordre de tri des lignes dans un groupe. |
Le paramètre request.columnsToGet contrôle les colonnes d'attribut renvoyées. Pour renvoyer directement les colonnes d'attribut depuis l'index de recherche, stockez les champs lors de la création de l'index. Si aucune colonne n'est spécifiée, seules les clés primaires sont renvoyées.
Regroupements
Ajoutez les objets de paramètres suivants à request.searchQuery.groupByList[]. groupByName identifie le résultat correspondant et doit être unique dans une requête.
GroupByField
|
Nom |
Type |
Description |
|
groupByName (obligatoire) |
String |
Nom du regroupement. |
|
fieldName (obligatoire) |
String |
Nom du champ de regroupement. Les champs Long, Double, Boolean, Keyword, Date et IP sont pris en charge. |
|
size (facultatif) |
Integer |
Nombre de groupes à renvoyer. Valeur par défaut : |
|
minDocCount (facultatif) |
Long |
Nombre minimal de lignes dans un groupe. Les groupes contenant moins de lignes ne sont pas renvoyés. |
|
groupBySorters (facultatif) |
|
Règles de tri des groupes. Par défaut, les groupes sont triés par nombre de lignes dans l'ordre décroissant. Plusieurs règles s'appliquent dans l'ordre dans lequel elles sont ajoutées. |
|
subAggregations (facultatif) |
|
Agrégations de métriques calculées au sein de chaque groupe. |
|
subGroupBys (facultatif) |
|
Regroupements appliqués au sein de chaque groupe parent. |
groupBySorters[] prend en charge les valeurs suivantes.
|
Valeur |
Description |
|
groupKeySortInAsc |
Trie les groupes par clé dans l'ordre lexicographique croissant. |
|
groupKeySortInDesc |
Trie les groupes par clé dans l'ordre lexicographique décroissant. |
|
rowCountSortInAsc |
Trie les groupes par nombre de lignes dans l'ordre croissant. |
|
rowCountSortInDesc |
Trie les groupes par nombre de lignes dans l'ordre décroissant. Il s'agit de la valeur par défaut. |
|
subAggSortInAsc |
Trie les groupes par la valeur d'une sous-agrégation spécifiée dans l'ordre croissant. |
|
subAggSortInDesc |
Trie les groupes par la valeur d'une sous-agrégation spécifiée dans l'ordre décroissant. |
GroupByComposite
|
Nom |
Type |
Description |
|
groupByName (obligatoire) |
String |
Nom du regroupement. |
|
sources (obligatoire) |
|
Sources de regroupement pour plusieurs champs. Jusqu'à 32 champs sont pris en charge. Les sources peuvent être |
|
nextToken (facultatif) |
String |
Jeton de pagination pour la page suivante de groupes. Omettez ce paramètre dans la première requête. Si |
|
size (facultatif) |
Integer |
Nombre de groupes à renvoyer. Valeur par défaut : |
|
suggestedSize (facultatif) |
Integer |
Limite souple pour les intégrations à haut débit avec des moteurs de calcul tels que Spark et Presto. Vous pouvez définir ce paramètre sur |
|
subAggregations (facultatif) |
|
Sous-agrégations. |
|
subGroupBys (facultatif) |
|
Sous-regroupements. |
Le SDK Tablestore pour Java représente nextToken sous forme de chaîne. Si vous persistez ou transférez le jeton, ne modifiez pas son contenu.
GroupByRange
|
Nom |
Type |
Description |
|
groupByName (obligatoire) |
String |
Nom du regroupement. |
|
fieldName (obligatoire) |
String |
Nom du champ de regroupement. Les champs Long et Double sont pris en charge. |
|
ranges (obligatoire) |
|
Plages. Chaque plage est fermée à gauche et ouverte à droite : |
|
subAggregations (facultatif) |
|
Sous-agrégations. |
|
subGroupBys (facultatif) |
|
Sous-regroupements. |
GroupByGeoDistance
|
Nom |
Type |
Description |
|
groupByName (obligatoire) |
String |
Nom du regroupement. |
|
fieldName (obligatoire) |
String |
Nom du champ de regroupement. Seuls les champs Geo-point sont pris en charge. |
|
origin (obligatoire) |
GeoPoint |
Point central. Les paramètres du constructeur sont la latitude suivie de la longitude. La plage de latitude est |
|
ranges (obligatoire) |
|
Plages de distance en mètres. Chaque plage est fermée à gauche et ouverte à droite : |
|
subAggregations (facultatif) |
|
Sous-agrégations. |
|
subGroupBys (facultatif) |
|
Sous-regroupements. |
GroupByFilter
|
Nom |
Type |
Description |
|
groupByName (obligatoire) |
String |
Nom du regroupement. |
|
filters (obligatoire) |
|
Filtres. Les résultats sont renvoyés dans l'ordre dans lequel les filtres sont ajoutés. |
|
subAggregations (facultatif) |
|
Sous-agrégations. |
|
subGroupBys (facultatif) |
|
Sous-regroupements. |
GroupByHistogram
|
Nom |
Type |
Description |
|
groupByName (obligatoire) |
String |
Nom du regroupement. |
|
fieldName (obligatoire) |
String |
Nom du champ de regroupement. Les champs Long et Double sont pris en charge. |
|
interval (obligatoire) |
ColumnValue |
Intervalle de l'histogramme. |
|
fieldRange (facultatif) |
FieldRange |
Plage d'agrégation, qui contient |
|
offset (facultatif) |
ColumnValue |
Décalage des limites des compartiments par rapport au point de départ par défaut. |
|
minDocCount (facultatif) |
Long |
Nombre minimal de lignes dans un compartiment. Les compartiments contenant moins de lignes ne sont pas renvoyés. |
|
missing (facultatif) |
ColumnValue |
Valeur utilisée dans l'histogramme si |
|
groupBySorters (facultatif) |
|
Règles de tri des compartiments. |
|
subAggregations (facultatif) |
|
Sous-agrégations. |
|
subGroupBys (facultatif) |
|
Sous-regroupements. |
GroupByDateHistogram
L'agrégation par histogramme de date est prise en charge par le SDK Tablestore pour Java 5.16.1 et versions ultérieures. Le type de champ Date pour les index de recherche est pris en charge par le SDK Tablestore pour Java 5.13.9 et versions ultérieures. Pour plus d'informations sur les versions, consultez Historique des versions du SDK Tablestore pour Java.
|
Nom |
Type |
Description |
|
groupByName (obligatoire) |
String |
Nom du regroupement. |
|
fieldName (obligatoire) |
String |
Nom du champ de regroupement. Seuls les champs Date sont pris en charge. |
|
interval (obligatoire) |
DateTimeValue |
Intervalle de date ou d'heure, composé d'une valeur et d'un |
|
fieldRange (facultatif) |
FieldRange |
Plage d'agrégation, qui contient |
|
minDocCount (facultatif) |
Long |
Nombre minimal de lignes dans un compartiment. Les compartiments contenant moins de lignes ne sont pas renvoyés. |
|
missing (facultatif) |
ColumnValue |
Valeur de date utilisée dans l'histogramme si |
|
timeZone (facultatif) |
String |
Fuseau horaire au format |
|
groupBySorters (facultatif) |
|
Règles de tri des compartiments. |
|
subAggregations (facultatif) |
|
Sous-agrégations. |
|
subGroupBys (facultatif) |
|
Sous-regroupements. |
GroupByGeoGrid
|
Nom |
Type |
Description |
|
groupByName (obligatoire) |
String |
Nom du regroupement. |
|
fieldName (obligatoire) |
String |
Nom du champ de regroupement. Seuls les champs Geo-point sont pris en charge. |
|
precision (obligatoire) |
GeoHashPrecision |
Précision de la grille GeoHash. Les valeurs vont de |
|
size (facultatif) |
Integer |
Nombre de groupes de grille à renvoyer. |
|
subAggregations (facultatif) |
|
Sous-agrégations. |
|
subGroupBys (facultatif) |
|
Sous-regroupements. |
Vous pouvez utiliser le SDK Tablestore pour Java pour calculer des métriques ou regrouper les résultats de recherche d'index, notamment en utilisant des histogrammes, des regroupements imbriqués et les premières lignes des groupes.
Prérequis
Installez le SDK Tablestore pour Java et initialisez un client.
Fonctionnement
Une fois la recherche d'index terminée, l'agrégation calcule des métriques ou regroupe toutes les lignes correspondantes. Les agrégations de métriques calculent le minimum, le maximum, la somme, la moyenne, le nombre, le nombre distinct ou les percentiles des champs. Les regroupements classent les lignes par valeurs de champ, par plusieurs champs, par plages numériques, par distances géographiques, par filtres, par intervalles numériques, par intervalles de date ou par grilles géographiques. Vous pouvez également ajouter des agrégations de métriques ou des regroupements au sein d'un groupe.
|
Catégorie |
Type de configuration |
Description |
|
Agrégation de métriques |
MinAggregation |
Renvoie la valeur minimale d'un champ, similaire à |
|
Agrégation de métriques |
MaxAggregation |
Renvoie la valeur maximale d'un champ, similaire à |
|
Agrégation de métriques |
SumAggregation |
Renvoie la somme d'un champ numérique, similaire à |
|
Agrégation de métriques |
AvgAggregation |
Renvoie la valeur moyenne d'un champ, similaire à |
|
Agrégation de métriques |
CountAggregation |
Renvoie le nombre de lignes dans lesquelles un champ spécifié a une valeur, similaire à |
|
Agrégation de métriques |
DistinctCountAggregation |
Renvoie le nombre de valeurs distinctes dans un champ, similaire à |
|
Agrégation de métriques |
PercentilesAggregation |
Renvoie un ou plusieurs percentiles d'un champ. |
|
Agrégation de métriques |
TopRowsAggregation |
Renvoie les premières lignes de chaque groupe selon un ordre spécifié. |
|
Regroupement |
GroupByField |
Regroupe les lignes par la valeur d'un champ. |
|
Regroupement |
GroupByComposite |
Regroupe les lignes par plusieurs champs et prend en charge les jetons de pagination. |
|
Regroupement |
GroupByRange |
Regroupe les lignes par plages numériques. |
|
Regroupement |
GroupByGeoDistance |
Regroupe les lignes par plages de distance à partir d'un point central. |
|
Regroupement |
GroupByFilter |
Regroupe les lignes par plusieurs filtres. |
|
Regroupement |
GroupByHistogram |
Crée un histogramme en utilisant des intervalles numériques fixes. |
|
Regroupement |
GroupByDateHistogram |
Crée un histogramme en utilisant des intervalles de date ou d'heure fixes. |
|
Regroupement |
GroupByGeoGrid |
Regroupe les lignes par grille GeoHash. |
Le tri et l'agrégation doivent être activés pour un champ d'index de recherche utilisé dans une agrégation. Les types de champs pris en charge varient selon le type d'agrégation. Pour plus d'informations sur les types de champs d'index de recherche et leurs mappages avec les types de champs de table de données, consultez Types de données.
Les agrégations s'effectuent sur les correspondances de la recherche. Une requête contenant des agrégations est plus complexe qu'une requête interrogeant uniquement des lignes. Si vous n'avez pas besoin de lignes dans la réponse, définissez
limitsur0.Le compte distinct, les percentiles et les regroupements par champ utilisent des calculs approximatifs. Un compte distinct inférieur à 10 000 est proche d'une valeur exacte. Pour un compte distinct de 100 millions, l'erreur est d'environ 2 %. Les percentiles proches des extrémités sont généralement plus précis. Par exemple, P1 et P99 sont généralement plus précis que P50. Le calcul parallèle des regroupements par champ peut également introduire une petite erreur.
Vous pouvez combiner plusieurs agrégations. Un grand nombre d'agrégations ou un nesting profond augmente la complexité de la requête et peut augmenter la latence. Pour connaître les limites de nesting, consultez Limites des index de recherche.
Appelez search pour interroger les données. Configurez SearchQuery.aggregationList pour les agrégations de métriques et SearchQuery.groupByList pour les regroupements.
SearchResponse search(SearchRequest request)
L'exemple suivant interroge toutes les lignes d'un index de recherche, calcule le minimum, le maximum, la somme, la moyenne, le nombre, le nombre de catégories distinctes et le P50 des prix, et regroupe les lignes par catégorie.
SearchQuery searchQuery = SearchQuery.newBuilder()
.query(QueryBuilders.matchAll())
.limit(0)
.addAggregation(AggregationBuilders.min("min_price", "price"))
.addAggregation(AggregationBuilders.max("max_price", "price"))
.addAggregation(AggregationBuilders.sum("sum_price", "price"))
.addAggregation(AggregationBuilders.avg("avg_price", "price"))
.addAggregation(AggregationBuilders.count("price_count", "price"))
.addAggregation(AggregationBuilders.distinctCount(
"category_count", "category"))
.addAggregation(AggregationBuilders.percentiles(
"price_percentiles", "price")
.percentiles(Arrays.asList(50.0)))
.addGroupBy(GroupByBuilders.groupByField(
"category_group", "category").size(10))
.build();
SearchRequest request =
new SearchRequest("example_table", "example_index", searchQuery);
SearchResponse response = client.search(request);
AggregationResults aggregationResults = response.getAggregationResults();
System.out.println(aggregationResults
.getAsMinAggregationResult("min_price").getValue());
System.out.println(aggregationResults
.getAsMaxAggregationResult("max_price").getValue());
System.out.println(aggregationResults
.getAsSumAggregationResult("sum_price").getValue());
System.out.println(aggregationResults
.getAsAvgAggregationResult("avg_price").getValue());
System.out.println(aggregationResults
.getAsCountAggregationResult("price_count").getValue());
System.out.println(aggregationResults
.getAsDistinctCountAggregationResult("category_count").getValue());
System.out.println(aggregationResults
.getAsPercentilesAggregationResult("price_percentiles")
.getPercentilesAggregationItems());
GroupByFieldResult groupResult = response.getGroupByResults()
.getAsGroupByFieldResult("category_group");
for (GroupByFieldResultItem item :
groupResult.getGroupByFieldResultItems()) {
System.out.println(item.getKey() + ": " + item.getRowCount());
}
Réponse
La méthode search renvoie SearchResponse. Le tableau suivant décrit les champs liés à l'agrégation.
|
Nom |
Type |
Description |
|
aggregationResults |
AggregationResults |
Résultats de l'agrégation de métriques. Appelez |
|
groupByResults |
GroupByResults |
Résultats du regroupement. Appelez |
|
totalCount |
long |
Nombre de correspondances de la recherche. Appelez |
|
isAllSuccess |
boolean |
Indique si toutes les partitions d'index ont été interrogées. Appelez |
Résultats d'agrégation de métriques
|
Type de configuration |
Type de résultat |
Champ de résultat et accesseur |
|
MinAggregation |
MinAggregationResult |
|
|
MaxAggregation |
MaxAggregationResult |
|
|
SumAggregation |
SumAggregationResult |
|
|
AvgAggregation |
AvgAggregationResult |
|
|
CountAggregation |
CountAggregationResult |
|
|
DistinctCountAggregation |
DistinctCountAggregationResult |
|
|
PercentilesAggregation |
PercentilesAggregationResult |
|
|
TopRowsAggregation |
TopRowsAggregationResult |
|
Résultats de regroupement
|
Type de configuration |
Type de résultat |
Champs de résultat principaux |
|
GroupByField |
GroupByFieldResult |
|
|
GroupByComposite |
GroupByCompositeResult |
|
|
GroupByRange |
GroupByRangeResult |
|
|
GroupByGeoDistance |
GroupByGeoDistanceResult |
|
|
GroupByFilter |
GroupByFilterResult |
|
|
GroupByHistogram |
GroupByHistogramResult |
|
|
GroupByDateHistogram |
GroupByDateHistogramResult |
|
|
GroupByGeoGrid |
GroupByGeoGridResult |
|
Exemples
Utiliser des sous-agrégations et des sous-regroupements
L'exemple suivant regroupe les lignes par catégorie, calcule le prix le plus élevé dans chaque catégorie, puis regroupe les lignes de chaque catégorie par ville. Les règles de tri des groupes s'appliquent dans l'ordre dans lequel elles sont ajoutées.
SearchQuery searchQuery = SearchQuery.newBuilder()
.query(QueryBuilders.matchAll())
.limit(0)
.addGroupBy(GroupByBuilders.groupByField(
"category_group", "category")
.size(10)
.addGroupBySorter(GroupBySorter.groupKeySortInAsc())
.addSubAggregation(AggregationBuilders.max(
"max_price", "price"))
.addSubGroupBy(GroupByBuilders.groupByField(
"city_group", "city").size(10)))
.build();
SearchRequest request =
new SearchRequest("example_table", "example_index", searchQuery);
SearchResponse response = client.search(request);
GroupByFieldResult result = response.getGroupByResults()
.getAsGroupByFieldResult("category_group");
for (GroupByFieldResultItem item :
result.getGroupByFieldResultItems()) {
double maxPrice = item.getSubAggregationResults()
.getAsMaxAggregationResult("max_price")
.getValue();
GroupByFieldResult cityResult = item.getSubGroupByResults()
.getAsGroupByFieldResult("city_group");
System.out.println(item.getKey() + ": " + maxPrice);
System.out.println(cityResult.getGroupByFieldResultItems());
}
Paginer un regroupement multi-champs
GroupByComposite renvoie des clés multi-colonnes dans une structure plate et prend en charge la pagination via nextToken.
GroupByComposite.Builder compositeBuilder = GroupByBuilders
.groupByComposite("category_city_group")
.addSources(GroupByBuilders.groupByField(
"category", "category")
.addGroupBySorter(GroupBySorter.groupKeySortInAsc()))
.addSources(GroupByBuilders.groupByField(
"city", "city")
.addGroupBySorter(GroupBySorter.groupKeySortInAsc()))
.size(100);
String nextToken = null;
do {
GroupByComposite groupBy = nextToken == null
? compositeBuilder.build()
: compositeBuilder.nextToken(nextToken).build();
SearchQuery searchQuery = SearchQuery.newBuilder()
.query(QueryBuilders.matchAll())
.limit(0)
.addGroupBy(groupBy)
.build();
SearchRequest request = new SearchRequest(
"example_table", "example_index", searchQuery);
SearchResponse response = client.search(request);
GroupByCompositeResult result = response.getGroupByResults()
.getAsGroupByCompositeResult("category_city_group");
for (GroupByCompositeResultItem item :
result.getGroupByCompositeResultItems()) {
System.out.println(item.getKeys() + ": " + item.getRowCount());
}
nextToken = result.getNextToken();
} while (nextToken != null);
Regrouper par plage, distance et filtre
Le code suivant montre les configurations principales de trois types de regroupement. Vous pouvez les combiner dans la même SearchQuery.
GroupByRange priceRanges = GroupByBuilders
.groupByRange("price_ranges", "price")
.addRange(0, 100)
.addRange(100, 500)
.build();
GroupByGeoDistance distanceRanges = GroupByBuilders
.groupByGeoDistance("distance_ranges", "location")
.origin(30.2741, 120.1551)
.addRange(0, 10000)
.addRange(10000, 100000)
.build();
GroupByFilter categoryFilters = GroupByBuilders
.groupByFilter("category_filters")
.addFilter(QueryBuilders.term("category", "books"))
.addFilter(QueryBuilders.term("category", "games"))
.build();
Créer des histogrammes numériques et de date
L'exemple suivant regroupe les lignes par un intervalle numérique de 20 et un intervalle de date d'un mois.
GroupByHistogram priceHistogram = GroupByBuilders
.groupByHistogram("price_histogram", "price")
.interval(20)
.offset(0)
.minDocCount(1L)
.addFieldRange(0, 100)
.addGroupBySorter(GroupBySorter.groupKeySortInAsc())
.build();
GroupByDateHistogram dateHistogram = GroupByBuilders
.groupByDateHistogram("date_histogram", "event_date")
.interval(1, DateTimeUnit.MONTH)
.fieldRange("2026-01-01", "2026-06-01")
.timeZone("+08:00")
.minDocCount(1L)
.addGroupBySorter(GroupBySorter.groupKeySortInAsc())
.build();
SearchQuery searchQuery = SearchQuery.newBuilder()
.query(QueryBuilders.matchAll())
.limit(0)
.addGroupBy(priceHistogram)
.addGroupBy(dateHistogram)
.build();
SearchResponse response = client.search(new SearchRequest(
"example_table", "example_index", searchQuery));
Regrouper par grille géographique
L'exemple suivant regroupe un champ géographique en grilles GeoHash d'environ 39 km × 19 km.
SearchQuery searchQuery = SearchQuery.newBuilder()
.query(QueryBuilders.matchAll())
.limit(0)
.addGroupBy(GroupByBuilders.groupByGeoGrid(
"geo_grid", "location")
.precision(GeoHashPrecision.GHP_39KM_19KM_4)
.size(100))
.build();
SearchResponse response = client.search(new SearchRequest(
"example_table", "example_index", searchQuery));
GroupByGeoGridResult result = response.getGroupByResults()
.getAsGroupByGeoGridResult("geo_grid");
System.out.println(result.getGroupByGeoGridResultItems());
Renvoyer des lignes depuis les groupes
L'exemple suivant regroupe les lignes par catégorie et renvoie la ligne ayant le prix le plus élevé dans chaque catégorie.
SearchQuery searchQuery = SearchQuery.newBuilder()
.query(QueryBuilders.matchAll())
.limit(0)
.addGroupBy(GroupByBuilders.groupByField(
"category_group", "category")
.size(10)
.addSubAggregation(AggregationBuilders.topRows(
"top_price")
.limit(1)
.sort(new Sort(Arrays.asList(
new FieldSort(
"price", SortOrder.DESC))))))
.build();
SearchRequest.ColumnsToGet columnsToGet =
new SearchRequest.ColumnsToGet();
columnsToGet.setColumns(Arrays.asList("category", "price"));
SearchRequest request =
new SearchRequest("example_table", "example_index", searchQuery);
request.setColumnsToGet(columnsToGet);
SearchResponse response = client.search(request);
GroupByFieldResult result = response.getGroupByResults()
.getAsGroupByFieldResult("category_group");
for (GroupByFieldResultItem item :
result.getGroupByFieldResultItems()) {
List<Row> rows = item.getSubAggregationResults()
.getAsTopRowsAggregationResult("top_price")
.getRows();
System.out.println(item.getKey() + ": " + rows);
}
Comparaison des regroupements multi-champs
Pour regrouper par plusieurs champs, imbriquez plusieurs configurations GroupByField ou utilisez directement GroupByComposite. Choisissez en fonction des exigences de pagination, de la structure de la réponse et des règles de tri.
|
Élément |
Regroupements de champs imbriqués |
Regroupement composite |
|
Configuration |
Ajoutez |
Ajoutez plusieurs sources de regroupement à |
|
Nombre de groupes |
Jusqu'à 2 000 groupes à chaque niveau. |
Jusqu'à 2 000 groupes par page. |
|
Nombre de champs |
Jusqu'à trois niveaux d'imbrication. |
Jusqu'à 32 champs. |
|
Structure de la réponse |
Imbriquée par niveaux parent et enfant. |
Les clés multi-colonnes sont renvoyées sous forme de liste plate. |
|
Pagination |
Non prise en charge. |
Prise en charge via |
|
Tri |
Prend en charge le tri par clé de groupe, nombre de lignes ou valeur de sous-agrégation. |
Chaque source de regroupement prend en charge uniquement le tri lexicographique par clé. L'ordre par défaut est décroissant. |
|
Sous-agrégations |
Prises en charge. |
Prises en charge. |
|
Compatibilité des champs de date |
Les clés de groupe utilisent le format de date défini pour le champ. |
Les clés de groupe de date sont renvoyées sous forme de chaînes d'horodatage. |