El Tablestore SDK para Java permite calcular métricas o agrupar los resultados de consultas de índices de búsqueda, incluso mediante histogramas, group-bys anidados y filas principales dentro de grupos.
Requisitos previos
Instale Tablestore SDK for Java e inicialice un cliente.
Funcionamiento
Una vez completada la consulta del índice de búsqueda, la agregación calcula métricas o agrupa todas las filas coincidentes. Las agregaciones de métricas calculan el valor mínimo, máximo, suma, promedio, conteo, conteo distinto o percentiles de los campos. Los group-bys agrupan filas por valores de campo, varios campos, rangos numéricos, distancias geográficas, filtros, intervalos numéricos, intervalos de fecha o cuadrículas geográficas. También es posible agregar agregaciones de métricas o group-bys dentro de un grupo.
|
Categoría |
Tipo de configuración |
Descripción |
|
Agregación de métrica |
MinAggregation |
Devuelve el valor mínimo de un campo, similar a |
|
Agregación de métrica |
MaxAggregation |
Devuelve el valor máximo de un campo, similar a |
|
Agregación de métrica |
SumAggregation |
Devuelve la suma de un campo numérico, similar a |
|
Agregación de métrica |
AvgAggregation |
Devuelve el valor promedio de un campo, similar a |
|
Agregación de métrica |
CountAggregation |
Devuelve el número de filas en las que un campo especificado tiene valor, similar a |
|
Agregación de métrica |
DistinctCountAggregation |
Devuelve el número de valores distintos en un campo, similar a |
|
Agregación de métrica |
PercentilesAggregation |
Devuelve uno o más percentiles de un campo. |
|
Agregación de métrica |
TopRowsAggregation |
Devuelve las primeras filas de cada grupo según un orden especificado. |
|
Group-by |
GroupByField |
Agrupa filas por el valor de un solo campo. |
|
Group-by |
GroupByComposite |
Agrupa filas por varios campos y admite tokens de paginación. |
|
Group-by |
GroupByRange |
Agrupa filas por rangos numéricos. |
|
Group-by |
GroupByGeoDistance |
Agrupa filas por rangos de distancia desde un punto central. |
|
Group-by |
GroupByFilter |
Agrupa filas por varios filtros. |
|
Group-by |
GroupByHistogram |
Crea un histograma con intervalos numéricos fijos. |
|
Group-by |
GroupByDateHistogram |
Crea un histograma con intervalos de fecha u hora fijos. |
|
Group-by |
GroupByGeoGrid |
Agrupa filas por cuadrícula GeoHash. |
La ordenación y la agregación deben estar habilitadas para cualquier campo del índice de búsqueda utilizado en una agregación. Los tipos de campo compatibles varían según el tipo de agregación. Para obtener información sobre los tipos de campo del índice de búsqueda y sus asignaciones con los tipos de campo de la tabla de datos, consulte Data types.
Las agregaciones operan sobre las coincidencias de la consulta. Una solicitud que incluye agregaciones es más compleja que una que solo consulta filas. Si no necesita filas en la respuesta, establezca
limiten0.El conteo distinto, los percentiles y los group-bys de campo utilizan cálculos aproximados. Un conteo distinto inferior a 10,000 se aproxima al valor exacto. Con un conteo distinto de 100 millones, el error es de aproximadamente 2%. Los percentiles cercanos a los extremos suelen ser más precisos; por ejemplo, P1 y P99 generalmente son más precisos que P50. El cálculo paralelo de group-bys de campo también puede introducir un pequeño margen de error.
Es posible combinar varias agregaciones. Un gran número de agregaciones o un anidamiento profundo aumenta la complejidad de la solicitud y puede incrementar la latencia. Para consultar los límites de anidamiento, consulte Search index limits.
Llame a search para consultar datos. Configure SearchQuery.aggregationList para agregaciones de métricas y SearchQuery.groupByList para group-bys.
SearchResponse search(SearchRequest request)
En el siguiente ejemplo se consultan todas las filas de un índice de búsqueda, se calculan el mínimo, máximo, suma, promedio, conteo, número de categorías distintas y P50 de los precios, y se agrupan las filas por categoría.
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());
}
Parámetros
Solicitud de consulta
El tipo de request es SearchRequest. La siguiente tabla describe sus parámetros.
|
Nombre |
Tipo |
Descripción |
|
tableName (obligatorio) |
String |
Nombre de la tabla de datos. |
|
indexName (obligatorio) |
String |
Nombre del índice de búsqueda. |
|
searchQuery (obligatorio) |
SearchQuery |
Condición de consulta y configuraciones de agregación. |
|
columnsToGet (opcional) |
SearchRequest.ColumnsToGet |
Columnas que se devolverán. Este parámetro solo aplica cuando |
|
timeoutInMillisecond (opcional) |
int |
Tiempo de espera de la consulta a nivel de solicitud, en milisegundos. Valor predeterminado: |
|
routingValues (opcional) |
|
Valores de clave principal de los campos de enrutamiento personalizado. No es necesario configurar este parámetro si no se utiliza enrutamiento personalizado. |
Configuración de consulta
El tipo de request.searchQuery es SearchQuery. La siguiente tabla describe los parámetros relacionados con la agregación.
|
Nombre |
Tipo |
Descripción |
|
query (obligatorio) |
Query |
Condición de consulta que determina el alcance de la agregación. Para agregar todas las filas de un índice de búsqueda, utilice |
|
aggregationList (opcional) |
|
Configuraciones de agregación de métricas. Configure como mínimo este parámetro o |
|
groupByList (opcional) |
|
Configuraciones de group-by. Configure como mínimo este parámetro o |
|
limit (opcional) |
Integer |
Número máximo de filas que se devolverán. Valor predeterminado: |
|
offset (opcional) |
Integer |
Posición de fila desde la cual comienza la consulta. Valor predeterminado: |
|
sort (opcional) |
Sort |
Orden de clasificación de los resultados de la consulta. Este parámetro no modifica el alcance de las agregaciones de métricas ni de los group-bys regulares. |
|
trackTotalCount (opcional) |
int |
Número máximo esperado de filas coincidentes que se contarán. Si este parámetro se establece en |
|
filter (opcional) |
SearchFilter |
Filtro aplicado a los resultados de |
Agregaciones de métricas
Agregue los siguientes objetos de parámetro a request.searchQuery.aggregationList[]. aggName identifica el resultado correspondiente y debe ser único dentro de una solicitud.
MinAggregation, MaxAggregation y AvgAggregation
|
Nombre |
Tipo |
Descripción |
|
aggName (obligatorio) |
String |
Nombre de la agregación. |
|
fieldName (obligatorio) |
String |
Nombre del campo de agregación. Se admiten campos Long, Double y Date. |
|
missing (opcional) |
ColumnValue |
Valor que se utiliza si falta |
SumAggregation
|
Nombre |
Tipo |
Descripción |
|
aggName (obligatorio) |
String |
Nombre de la agregación. |
|
fieldName (obligatorio) |
String |
Nombre del campo de agregación. Se admiten campos Long y Double. |
|
missing (opcional) |
ColumnValue |
Valor que se utiliza en la suma si falta |
CountAggregation
|
Nombre |
Tipo |
Descripción |
|
aggName (obligatorio) |
String |
Nombre de la agregación. |
|
fieldName (obligatorio) |
String |
Campo cuyos valores no nulos se contarán. Se admiten campos Long, Double, Boolean, Keyword, Date, IP y Geo-point. No se cuentan las filas de una columna dispersa que no contengan el campo. |
Para contar todas las coincidencias de la consulta, configure trackTotalCount en SearchQuery y lea SearchResponse.totalCount. Para contar todas las filas de un índice de búsqueda, utilice MatchAllQuery.
DistinctCountAggregation
|
Nombre |
Tipo |
Descripción |
|
aggName (obligatorio) |
String |
Nombre de la agregación. |
|
fieldName (obligatorio) |
String |
Campo cuyos valores distintos se contarán. Se admiten campos Long, Double, Boolean, Keyword, Date, IP y Geo-point. |
|
missing (opcional) |
ColumnValue |
Valor que se utiliza para el conteo distinto si falta |
PercentilesAggregation
|
Nombre |
Tipo |
Descripción |
|
aggName (obligatorio) |
String |
Nombre de la agregación. |
|
fieldName (obligatorio) |
String |
Nombre del campo de agregación. Se admiten campos Long, Double y Date. |
|
percentiles (obligatorio) |
|
Percentiles que se calcularán, como |
|
missing (opcional) |
ColumnValue |
Valor que se utiliza en el cálculo de percentiles si falta |
TopRowsAggregation
Utilice TopRowsAggregation como subagregación de un group-by.
|
Nombre |
Tipo |
Descripción |
|
aggName (obligatorio) |
String |
Nombre de la agregación. |
|
limit (opcional) |
Integer |
Número máximo de filas que se devolverán de cada grupo. Valor predeterminado: |
|
sort (opcional) |
Sort |
Orden de clasificación de las filas dentro de un grupo. |
El parámetro request.columnsToGet controla las columnas de atributos que se devuelven. Para devolver columnas de atributos directamente desde el índice de búsqueda, almacene los campos al crear el índice. Si no se especifican columnas, solo se devuelven las claves principales.
Group-bys
Agregue los siguientes objetos de parámetro a request.searchQuery.groupByList[]. groupByName identifica el resultado correspondiente y debe ser único dentro de una solicitud.
GroupByField
|
Nombre |
Tipo |
Descripción |
|
groupByName (obligatorio) |
String |
Nombre del group-by. |
|
fieldName (obligatorio) |
String |
Nombre del campo de agrupación. Se admiten campos Long, Double, Boolean, Keyword, Date e IP. |
|
size (opcional) |
Integer |
Número de grupos que se devolverán. Valor predeterminado: |
|
minDocCount (opcional) |
Long |
Número mínimo de filas en un grupo. Los grupos con menos filas no se devuelven. |
|
groupBySorters (opcional) |
|
Reglas de ordenación de grupos. De forma predeterminada, los grupos se ordenan por conteo de filas en orden descendente. Varias reglas surten efecto en el orden en que se agregan. |
|
subAggregations (opcional) |
|
Agregaciones de métricas calculadas dentro de cada grupo. |
|
subGroupBys (opcional) |
|
Group-bys aplicados dentro de cada grupo padre. |
groupBySorters[] admite los siguientes valores.
|
Valor |
Descripción |
|
groupKeySortInAsc |
Ordena los grupos por clave en orden lexicográfico ascendente. |
|
groupKeySortInDesc |
Ordena los grupos por clave en orden lexicográfico descendente. |
|
rowCountSortInAsc |
Ordena los grupos por conteo de filas en orden ascendente. |
|
rowCountSortInDesc |
Ordena los grupos por conteo de filas en orden descendente. Es el comportamiento predeterminado. |
|
subAggSortInAsc |
Ordena los grupos por el valor de una subagregación especificada en orden ascendente. |
|
subAggSortInDesc |
Ordena los grupos por el valor de una subagregación especificada en orden descendente. |
GroupByComposite
|
Nombre |
Tipo |
Descripción |
|
groupByName (obligatorio) |
String |
Nombre del group-by. |
|
sources (obligatorio) |
|
Fuentes de agrupación para varios campos. Se admiten hasta 32 campos. Las fuentes pueden ser |
|
nextToken (opcional) |
String |
Token de paginación para la siguiente página de grupos. Omita este parámetro en la primera solicitud. Si |
|
size (opcional) |
Integer |
Número de grupos que se devolverán. Valor predeterminado: |
|
suggestedSize (opcional) |
Integer |
Límite flexible para integraciones de alto rendimiento con motores de cómputo como Spark y Presto. Puede establecer este parámetro en |
|
subAggregations (opcional) |
|
Subagregaciones. |
|
subGroupBys (opcional) |
|
Sub-group-bys. |
El Tablestore SDK para Java representa nextToken como una cadena. Si persiste o transfiere el token, no modifique su contenido.
GroupByRange
|
Nombre |
Tipo |
Descripción |
|
groupByName (obligatorio) |
String |
Nombre del group-by. |
|
fieldName (obligatorio) |
String |
Nombre del campo de agrupación. Se admiten campos Long y Double. |
|
ranges (obligatorio) |
|
Rangos. Cada rango es cerrado por la izquierda y abierto por la derecha: |
|
subAggregations (opcional) |
|
Subagregaciones. |
|
subGroupBys (opcional) |
|
Sub-group-bys. |
GroupByGeoDistance
|
Nombre |
Tipo |
Descripción |
|
groupByName (obligatorio) |
String |
Nombre del group-by. |
|
fieldName (obligatorio) |
String |
Nombre del campo de agrupación. Solo se admiten campos Geo-point. |
|
origin (obligatorio) |
GeoPoint |
Punto central. Los parámetros del constructor son latitud seguida de longitud. El rango de latitud es |
|
ranges (obligatorio) |
|
Rangos de distancia en metros. Cada rango es cerrado por la izquierda y abierto por la derecha: |
|
subAggregations (opcional) |
|
Subagregaciones. |
|
subGroupBys (opcional) |
|
Sub-group-bys. |
GroupByFilter
|
Nombre |
Tipo |
Descripción |
|
groupByName (obligatorio) |
String |
Nombre del group-by. |
|
filters (obligatorio) |
|
Filtros. Los resultados se devuelven en el orden en que se agregan los filtros. |
|
subAggregations (opcional) |
|
Subagregaciones. |
|
subGroupBys (opcional) |
|
Sub-group-bys. |
GroupByHistogram
|
Nombre |
Tipo |
Descripción |
|
groupByName (obligatorio) |
String |
Nombre del group-by. |
|
fieldName (obligatorio) |
String |
Nombre del campo de agrupación. Se admiten campos Long y Double. |
|
interval (obligatorio) |
ColumnValue |
Intervalo del histograma. |
|
fieldRange (opcional) |
FieldRange |
Rango de agregación, que contiene |
|
offset (opcional) |
ColumnValue |
Desplazamiento de los límites del bucket respecto al punto de inicio predeterminado. |
|
minDocCount (opcional) |
Long |
Número mínimo de filas en un bucket. Los buckets con menos filas no se devuelven. |
|
missing (opcional) |
ColumnValue |
Valor que se utiliza en el histograma si falta |
|
groupBySorters (opcional) |
|
Reglas de ordenación de buckets. |
|
subAggregations (opcional) |
|
Subagregaciones. |
|
subGroupBys (opcional) |
|
Sub-group-bys. |
GroupByDateHistogram
La agregación de histograma de fechas es compatible con Tablestore SDK para Java 5.16.1 y versiones posteriores. El tipo de campo Date para índices de búsqueda es compatible con Tablestore SDK para Java 5.13.9 y versiones posteriores. Para obtener información sobre versiones, consulte Tablestore SDK for Java version history.
|
Nombre |
Tipo |
Descripción |
|
groupByName (obligatorio) |
String |
Nombre del group-by. |
|
fieldName (obligatorio) |
String |
Nombre del campo de agrupación. Solo se admiten campos Date. |
|
interval (obligatorio) |
DateTimeValue |
Intervalo de fecha u hora, compuesto por un valor y una |
|
fieldRange (opcional) |
FieldRange |
Rango de agregación, que contiene |
|
minDocCount (opcional) |
Long |
Número mínimo de filas en un bucket. Los buckets con menos filas no se devuelven. |
|
missing (opcional) |
ColumnValue |
Valor de fecha que se utiliza en el histograma si falta |
|
timeZone (opcional) |
String |
Zona horaria en formato |
|
groupBySorters (opcional) |
|
Reglas de ordenación de buckets. |
|
subAggregations (opcional) |
|
Subagregaciones. |
|
subGroupBys (opcional) |
|
Sub-group-bys. |
GroupByGeoGrid
|
Nombre |
Tipo |
Descripción |
|
groupByName (obligatorio) |
String |
Nombre del group-by. |
|
fieldName (obligatorio) |
String |
Nombre del campo de agrupación. Solo se admiten campos Geo-point. |
|
precision (obligatorio) |
GeoHashPrecision |
Precisión de la cuadrícula GeoHash. Los valores van desde |
|
size (opcional) |
Integer |
Número de grupos de cuadrícula que se devolverán. |
|
subAggregations (opcional) |
|
Subagregaciones. |
|
subGroupBys (opcional) |
|
Sub-group-bys. |
Respuesta
El método search devuelve SearchResponse. La siguiente tabla describe los campos relacionados con la agregación.
|
Nombre |
Tipo |
Descripción |
|
aggregationResults |
AggregationResults |
Resultados de agregación de métricas. Llame a |
|
groupByResults |
GroupByResults |
Resultados de group-by. Llame a |
|
totalCount |
long |
Número de coincidencias de la consulta. Llame a |
|
isAllSuccess |
boolean |
Indica si se consultaron todas las particiones del índice. Llame a |
Resultados de agregación de métricas
|
Tipo de configuración |
Tipo de resultado |
Campo de resultado y método de acceso |
|
MinAggregation |
MinAggregationResult |
|
|
MaxAggregation |
MaxAggregationResult |
|
|
SumAggregation |
SumAggregationResult |
|
|
AvgAggregation |
AvgAggregationResult |
|
|
CountAggregation |
CountAggregationResult |
|
|
DistinctCountAggregation |
DistinctCountAggregationResult |
|
|
PercentilesAggregation |
PercentilesAggregationResult |
|
|
TopRowsAggregation |
TopRowsAggregationResult |
|
Resultados de group-by
|
Tipo de configuración |
Tipo de resultado |
Campos principales del resultado |
|
GroupByField |
GroupByFieldResult |
|
|
GroupByComposite |
GroupByCompositeResult |
|
|
GroupByRange |
GroupByRangeResult |
|
|
GroupByGeoDistance |
GroupByGeoDistanceResult |
|
|
GroupByFilter |
GroupByFilterResult |
|
|
GroupByHistogram |
GroupByHistogramResult |
|
|
GroupByDateHistogram |
GroupByDateHistogramResult |
|
|
GroupByGeoGrid |
GroupByGeoGridResult |
|
Ejemplos
Uso de subagregaciones y sub-group-bys
En el siguiente ejemplo se agrupan filas por categoría, se calcula el precio más alto en cada categoría y luego se agrupan las filas de cada categoría por ciudad. Las reglas de ordenación de grupos surten efecto en el orden en que se agregan.
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());
}
Paginación de un group-by de varios campos
GroupByComposite devuelve claves de varias columnas en una estructura plana y admite paginación mediante 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);
Agrupación por rango, distancia y filtro
El siguiente código muestra las configuraciones principales de tres tipos de group-by. Puede combinarlos en el mismo 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();
Creación de histogramas numéricos y de fechas
En el siguiente ejemplo se agrupan filas por un intervalo numérico de 20 y un intervalo de fechas de un mes.
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));
Agrupación por cuadrícula geográfica
En el siguiente ejemplo se agrupa un campo geográfico en cuadrículas GeoHash de aproximadamente 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());
Devolución de filas desde grupos
En el siguiente ejemplo se agrupan filas por categoría y se devuelve la fila con el precio más alto de cada categoría.
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);
}
Comparación de group-by de varios campos
Para agrupar por varios campos, anide múltiples configuraciones de GroupByField o utilice GroupByComposite directamente. Elija según los requisitos de paginación, la estructura de respuesta y las reglas de ordenación.
|
Elemento |
Group-bys de campo anidados |
Group-by compuesto |
|
Configuración |
Agregue |
Agregue varias fuentes de agrupación a |
|
Número de grupos |
Hasta 2,000 grupos en cada nivel. |
Hasta 2,000 grupos por página. |
|
Número de campos |
Hasta tres niveles anidados. |
Hasta 32 campos. |
|
Estructura de respuesta |
Anidada por niveles padre e hijo. |
Las claves de varias columnas se devuelven como una lista plana. |
|
Paginación |
No compatible. |
Compatible mediante |
|
Ordenación |
Admite ordenación por clave de grupo, conteo de filas o valor de subagregación. |
Cada fuente de agrupación solo admite ordenación lexicográfica por clave. El orden predeterminado es descendente. |
|
Subagregaciones |
Compatible. |
Compatible. |
|
Compatibilidad con campos de fecha |
Las claves de grupo utilizan el formato de fecha definido para el campo. |
Las claves de grupo de fechas se devuelven como cadenas de marcas de tiempo. |