Use o Tablestore SDK for Java para calcular métricas ou agrupar resultados de consultas em índices de busca, inclusive com histogramas, group-bys aninhados e principais linhas por grupo.
Pré-requisitos
Instale o Tablestore SDK for Java e inicialize um cliente.
Funcionamento
Após a conclusão de uma consulta no índice de busca, a agregação calcula métricas ou agrupa todas as linhas correspondentes. As agregações de métrica calculam valores mínimos, máximos, soma, média, contagem, contagem distinta ou percentis de campos. Os group-bys agrupam linhas por valores de campo, múltiplos campos, intervalos numéricos, distâncias geográficas, filtros, intervalos numéricos fixos, intervalos de data ou grades geográficas. Também é possível adicionar agregações de métrica ou group-bys dentro de um grupo.
|
Categoria |
Tipo de configuração |
Descrição |
|
Agregação de métrica |
MinAggregation |
Retorna o valor mínimo de um campo, semelhante ao |
|
Agregação de métrica |
MaxAggregation |
Retorna o valor máximo de um campo, semelhante ao |
|
Agregação de métrica |
SumAggregation |
Retorna a soma de um campo numérico, semelhante ao |
|
Agregação de métrica |
AvgAggregation |
Retorna o valor médio de um campo, semelhante ao |
|
Agregação de métrica |
CountAggregation |
Retorna o número de linhas em que um campo especificado possui valor, semelhante ao |
|
Agregação de métrica |
DistinctCountAggregation |
Retorna o número de valores distintos em um campo, semelhante ao |
|
Agregação de métrica |
PercentilesAggregation |
Retorna um ou mais percentis de um campo. |
|
Agregação de métrica |
TopRowsAggregation |
Retorna as primeiras linhas de cada grupo com base em uma ordem especificada. |
|
Group-by |
GroupByField |
Agrupa linhas pelo valor de um único campo. |
|
Group-by |
GroupByComposite |
Agrupa linhas por múltiplos campos e suporta tokens de paginação. |
|
Group-by |
GroupByRange |
Agrupa linhas por intervalos numéricos. |
|
Group-by |
GroupByGeoDistance |
Agrupa linhas por faixas de distância a partir de um ponto central. |
|
Group-by |
GroupByFilter |
Agrupa linhas por múltiplos filtros. |
|
Group-by |
GroupByHistogram |
Crie um histograma usando intervalos numéricos fixos. |
|
Group-by |
GroupByDateHistogram |
Crie um histograma usando intervalos fixos de data ou hora. |
|
Group-by |
GroupByGeoGrid |
Agrupa linhas por grade GeoHash. |
Ative a ordenação e a agregação para qualquer campo do índice de busca utilizado em uma agregação. Os tipos de campo suportados variam conforme o tipo de agregação. Para obter informações sobre os tipos de campo do índice de busca e seus mapeamentos para tipos de campo da tabela de dados, consulte Data types.
As agregações operam sobre as correspondências da consulta. Uma requisição com agregações é mais complexa do que uma requisição que apenas consulta linhas. Caso não precise das linhas na resposta, defina
limitcomo0.A contagem distinta, os percentis e os group-bys de campo utilizam cálculos aproximados. Uma contagem distinta abaixo de 10.000 aproxima-se do valor exato. Com uma contagem distinta de 100 milhões, a margem de erro é de aproximadamente 2%. Percentis nas extremidades costumam ser mais precisos; por exemplo, P1 e P99 geralmente são mais exatos que P50. O cálculo paralelo de group-bys de campo também pode introduzir uma pequena margem de erro.
É possível combinar múltiplas agregações. Um grande volume de agregações ou aninhamentos profundos aumenta a complexidade da requisição e pode elevar a latência. Para limites de aninhamento, consulte Search index limits.
Chame search para consultar dados. Configure SearchQuery.aggregationList para agregações de métrica e SearchQuery.groupByList para group-bys.
SearchResponse search(SearchRequest request)
O exemplo abaixo consulta todas as linhas em um índice de busca, calcula os valores mínimo, máximo, soma, média, contagem, quantidade de categorias distintas e P50 dos preços, além de agrupar as linhas por categoria.
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
Requisição de consulta
O tipo de request é SearchRequest. A tabela a seguir descreve seus parâmetros.
|
Nome |
Tipo |
Descrição |
|
tableName (obrigatório) |
String |
Nome da tabela de dados. |
|
indexName (obrigatório) |
String |
Nome do índice de busca. |
|
searchQuery (obrigatório) |
SearchQuery |
Condição de consulta e configurações de agregação. |
|
columnsToGet (opcional) |
SearchRequest.ColumnsToGet |
Colunas a retornar. Este parâmetro aplica-se apenas quando |
|
timeoutInMillisecond (opcional) |
int |
Tempo limite da consulta no nível da requisição, em milissegundos. Valor padrão: |
|
routingValues (opcional) |
|
Valores de chave primária dos campos de roteamento personalizado. Não é necessário configurar este parâmetro se o roteamento personalizado não for utilizado. |
Configuração da consulta
O tipo de request.searchQuery é SearchQuery. A tabela a seguir descreve os parâmetros relacionados à agregação.
|
Nome |
Tipo |
Descrição |
|
query (obrigatório) |
Query |
Condição de consulta que determina o escopo da agregação. Para agregar todas as linhas de um índice de busca, utilize |
|
aggregationList (opcional) |
|
Configurações de agregação de métrica. Configure pelo menos este parâmetro ou |
|
groupByList (opcional) |
|
Configurações de group-by. Configure pelo menos este parâmetro ou |
|
limit (opcional) |
Integer |
Número máximo de linhas a retornar. Valor padrão: |
|
offset (opcional) |
Integer |
Posição da linha onde a consulta começa. Valor padrão: |
|
sort (opcional) |
Sort |
Ordem de classificação dos resultados da consulta. Este parâmetro não altera o escopo das agregações de métrica ou dos group-bys comuns. |
|
trackTotalCount (opcional) |
int |
Número máximo esperado de linhas correspondentes a contar. Se este parâmetro for definido como |
|
filter (opcional) |
SearchFilter |
Filtro aplicado aos resultados da |
Agregações de métrica
Adicione os seguintes objetos de parâmetro a request.searchQuery.aggregationList[]. O aggName identifica o resultado correspondente e deve ser único na requisição.
MinAggregation, MaxAggregation e AvgAggregation
|
Nome |
Tipo |
Descrição |
|
aggName (obrigatório) |
String |
Nome da agregação. |
|
fieldName (obrigatório) |
String |
Nome do campo de agregação. Campos Long, Double e Date são suportados. |
|
missing (opcional) |
ColumnValue |
Valor utilizado caso |
SumAggregation
|
Nome |
Tipo |
Descrição |
|
aggName (obrigatório) |
String |
Nome da agregação. |
|
fieldName (obrigatório) |
String |
Nome do campo de agregação. Campos Long e Double são suportados. |
|
missing (opcional) |
ColumnValue |
Valor usado na soma caso |
CountAggregation
|
Nome |
Tipo |
Descrição |
|
aggName (obrigatório) |
String |
Nome da agregação. |
|
fieldName (obrigatório) |
String |
Campo cujos valores não nulos serão contados. Campos Long, Double, Boolean, Keyword, Date, IP e Geo-point são suportados. Linhas em uma coluna esparsa que não contenham o campo não são contabilizadas. |
Para contar todas as correspondências da consulta, configure trackTotalCount em SearchQuery e leia SearchResponse.totalCount. Para contar todas as linhas de um índice de busca, use MatchAllQuery.
DistinctCountAggregation
|
Nome |
Tipo |
Descrição |
|
aggName (obrigatório) |
String |
Nome da agregação. |
|
fieldName (obrigatório) |
String |
Campo cujos valores distintos serão contados. Campos Long, Double, Boolean, Keyword, Date, IP e Geo-point são suportados. |
|
missing (opcional) |
ColumnValue |
Valor usado na contagem distinta caso |
PercentilesAggregation
|
Nome |
Tipo |
Descrição |
|
aggName (obrigatório) |
String |
Nome da agregação. |
|
fieldName (obrigatório) |
String |
Nome do campo de agregação. Campos Long, Double e Date são suportados. |
|
percentiles (obrigatório) |
|
Percentis a calcular, como |
|
missing (opcional) |
ColumnValue |
Valor usado no cálculo de percentis caso |
TopRowsAggregation
Utilize TopRowsAggregation como uma subagregação de um group-by.
|
Nome |
Tipo |
Descrição |
|
aggName (obrigatório) |
String |
Nome da agregação. |
|
limit (opcional) |
Integer |
Número máximo de linhas a retornar de cada grupo. Valor padrão: |
|
sort (opcional) |
Sort |
Ordem de classificação das linhas dentro de um grupo. |
O parâmetro request.columnsToGet controla quais colunas de atributo retornar. Para retornar colunas de atributo diretamente do índice de busca, armazene os campos ao criar o índice. Se nenhuma coluna for especificada, apenas as chaves primárias serão retornadas.
Group-bys
Adicione os seguintes objetos de parâmetro a request.searchQuery.groupByList[]. O groupByName identifica o resultado correspondente e deve ser único na requisição.
GroupByField
|
Nome |
Tipo |
Descrição |
|
groupByName (obrigatório) |
String |
Nome do group-by. |
|
fieldName (obrigatório) |
String |
Nome do campo de agrupamento. Campos Long, Double, Boolean, Keyword, Date e IP são suportados. |
|
size (opcional) |
Integer |
Quantidade de grupos a retornar. Valor padrão: |
|
minDocCount (opcional) |
Long |
Número mínimo de linhas em um grupo. Grupos com menos linhas não são retornados. |
|
groupBySorters (opcional) |
|
Regras de ordenação dos grupos. Por padrão, os grupos são classificados pela contagem de linhas em ordem decrescente. Múltiplas regras entram em vigor na ordem em que são adicionadas. |
|
subAggregations (opcional) |
|
Agregações de métrica calculadas dentro de cada grupo. |
|
subGroupBys (opcional) |
|
Group-bys aplicados dentro de cada grupo pai. |
O groupBySorters[] suporta os seguintes valores.
|
Valor |
Descrição |
|
groupKeySortInAsc |
Classifica grupos por chave em ordem lexicográfica crescente. |
|
groupKeySortInDesc |
Classifica grupos por chave em ordem lexicográfica decrescente. |
|
rowCountSortInAsc |
Classifica grupos pela contagem de linhas em ordem crescente. |
|
rowCountSortInDesc |
Classifica grupos pela contagem de linhas em ordem decrescente. Esta é a configuração padrão. |
|
subAggSortInAsc |
Classifica grupos pelo valor de uma subagregação especificada em ordem crescente. |
|
subAggSortInDesc |
Classifica grupos pelo valor de uma subagregação especificada em ordem decrescente. |
GroupByComposite
|
Nome |
Tipo |
Descrição |
|
groupByName (obrigatório) |
String |
Nome do group-by. |
|
sources (obrigatório) |
|
Fontes de agrupamento para múltiplos campos. Até 32 campos são suportados. As fontes podem ser |
|
nextToken (opcional) |
String |
Token de paginação para a próxima página de grupos. Omita este parâmetro na primeira requisição. Se o |
|
size (opcional) |
Integer |
Quantidade de grupos a retornar. Valor padrão: |
|
suggestedSize (opcional) |
Integer |
Limite flexível para integrações de alto throughput com engines de computação como Spark e Presto. É possível definir este parâmetro como |
|
subAggregations (opcional) |
|
Subagregações. |
|
subGroupBys (opcional) |
|
Sub-group-bys. O próprio |
O Tablestore SDK for Java representa o nextToken como uma string. Ao persistir ou transferir o token, não modifique seu conteúdo.
GroupByRange
|
Nome |
Tipo |
Descrição |
|
groupByName (obrigatório) |
String |
Nome do group-by. |
|
fieldName (obrigatório) |
String |
Nome do campo de agrupamento. Campos Long e Double são suportados. |
|
ranges (obrigatório) |
|
Intervalos. Cada intervalo é fechado à esquerda e aberto à direita: |
|
subAggregations (opcional) |
|
Subagregações. |
|
subGroupBys (opcional) |
|
Sub-group-bys. |
GroupByGeoDistance
|
Nome |
Tipo |
Descrição |
|
groupByName (obrigatório) |
String |
Nome do group-by. |
|
fieldName (obrigatório) |
String |
Nome do campo de agrupamento. Apenas campos Geo-point são suportados. |
|
origin (obrigatório) |
GeoPoint |
Ponto central. Os parâmetros do construtor são latitude seguidos de longitude. O intervalo de latitude é |
|
ranges (obrigatório) |
|
Faixas de distância em metros. Cada intervalo é fechado à esquerda e aberto à direita: |
|
subAggregations (opcional) |
|
Subagregações. |
|
subGroupBys (opcional) |
|
Sub-group-bys. |
GroupByFilter
|
Nome |
Tipo |
Descrição |
|
groupByName (obrigatório) |
String |
Nome do group-by. |
|
filters (obrigatório) |
|
Filtros. Os resultados são retornados na ordem em que os filtros são adicionados. |
|
subAggregations (opcional) |
|
Subagregações. |
|
subGroupBys (opcional) |
|
Sub-group-bys. |
GroupByHistogram
|
Nome |
Tipo |
Descrição |
|
groupByName (obrigatório) |
String |
Nome do group-by. |
|
fieldName (obrigatório) |
String |
Nome do campo de agrupamento. Campos Long e Double são suportados. |
|
interval (obrigatório) |
ColumnValue |
Intervalo do histograma. |
|
fieldRange (opcional) |
FieldRange |
Faixa de agregação, contendo |
|
offset (opcional) |
ColumnValue |
Deslocamento dos limites dos buckets em relação ao ponto inicial padrão. |
|
minDocCount (opcional) |
Long |
Número mínimo de linhas em um bucket. Buckets com menos linhas não são retornados. |
|
missing (opcional) |
ColumnValue |
Valor usado no histograma caso |
|
groupBySorters (opcional) |
|
Regras de ordenação dos buckets. |
|
subAggregations (opcional) |
|
Subagregações. |
|
subGroupBys (opcional) |
|
Sub-group-bys. |
GroupByDateHistogram
A agregação de histograma de data é suportada pelo Tablestore SDK for Java 5.16.1 e versões posteriores. O tipo de campo Date para índices de busca é suportado pelo Tablestore SDK for Java 5.13.9 e versões posteriores. Para informações sobre versões, consulte Tablestore SDK for Java version history.
|
Nome |
Tipo |
Descrição |
|
groupByName (obrigatório) |
String |
Nome do group-by. |
|
fieldName (obrigatório) |
String |
Nome do campo de agrupamento. Apenas campos Date são suportados. |
|
interval (obrigatório) |
DateTimeValue |
Intervalo de data ou hora, composto por um valor e uma |
|
fieldRange (opcional) |
FieldRange |
Faixa de agregação, contendo |
|
minDocCount (opcional) |
Long |
Número mínimo de linhas em um bucket. Buckets com menos linhas não são retornados. |
|
missing (opcional) |
ColumnValue |
Valor de data usado no histograma caso |
|
timeZone (opcional) |
String |
Fuso horário no formato |
|
groupBySorters (opcional) |
|
Regras de ordenação dos buckets. |
|
subAggregations (opcional) |
|
Subagregações. |
|
subGroupBys (opcional) |
|
Sub-group-bys. |
GroupByGeoGrid
|
Nome |
Tipo |
Descrição |
|
groupByName (obrigatório) |
String |
Nome do group-by. |
|
fieldName (obrigatório) |
String |
Nome do campo de agrupamento. Apenas campos Geo-point são suportados. |
|
precision (obrigatório) |
GeoHashPrecision |
Precisão da grade GeoHash. Os valores variam de |
|
size (opcional) |
Integer |
Número de grupos de grade a retornar. |
|
subAggregations (opcional) |
|
Subagregações. |
|
subGroupBys (opcional) |
|
Sub-group-bys. |
Resposta
O método search retorna SearchResponse. A tabela a seguir descreve os campos relacionados à agregação.
|
Nome |
Tipo |
Descrição |
|
aggregationResults |
AggregationResults |
Resultados das agregações de métrica. Chame |
|
groupByResults |
GroupByResults |
Resultados dos group-bys. Chame |
|
totalCount |
long |
Número de correspondências da consulta. Chame |
|
isAllSuccess |
boolean |
Indica se todas as partições do índice foram consultadas. Chame |
Resultados de agregação de métrica
|
Tipo de configuração |
Tipo de resultado |
Campo de resultado e acessor |
|
MinAggregation |
MinAggregationResult |
|
|
MaxAggregation |
MaxAggregationResult |
|
|
SumAggregation |
SumAggregationResult |
|
|
AvgAggregation |
AvgAggregationResult |
|
|
CountAggregation |
CountAggregationResult |
|
|
DistinctCountAggregation |
DistinctCountAggregationResult |
|
|
PercentilesAggregation |
PercentilesAggregationResult |
|
|
TopRowsAggregation |
TopRowsAggregationResult |
|
Resultados de group-by
|
Tipo de configuração |
Tipo de resultado |
Campos principais do resultado |
|
GroupByField |
GroupByFieldResult |
|
|
GroupByComposite |
GroupByCompositeResult |
|
|
GroupByRange |
GroupByRangeResult |
|
|
GroupByGeoDistance |
GroupByGeoDistanceResult |
|
|
GroupByFilter |
GroupByFilterResult |
|
|
GroupByHistogram |
GroupByHistogramResult |
|
|
GroupByDateHistogram |
GroupByDateHistogramResult |
|
|
GroupByGeoGrid |
GroupByGeoGridResult |
|
Exemplos
Uso de subagregações e sub-group-bys
O exemplo a seguir agrupa linhas por categoria, calcula o preço mais alto em cada categoria e, em seguida, agrupa as linhas de cada categoria por cidade. As regras de ordenação de grupo entram em vigor na ordem em que são adicionadas.
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());
}
Paginação de um group-by de múltiplos campos
O GroupByComposite retorna chaves de múltiplas colunas em uma estrutura plana e suporta paginação 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);
Agrupamento por intervalo, distância e filtro
O código a seguir mostra as configurações principais de três tipos de group-by. É possível combiná-los no mesmo 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();
Criação de histogramas numéricos e de data
O exemplo a seguir agrupa linhas por um intervalo numérico de 20 e um intervalo de data de um mês.
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));
Agrupamento por grade geográfica
O exemplo a seguir agrupa um campo geográfico em grades 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());
Retorno de linhas dos grupos
O exemplo a seguir agrupa linhas por categoria e retorna a linha com o preço mais alto em cada categoria.
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);
}
Comparação de group-by de múltiplos campos
Para agrupar por múltiplos campos, aninhe várias configurações de GroupByField ou use GroupByComposite diretamente. Escolha com base nos requisitos de paginação, estrutura de resposta e regras de ordenação.
|
Item |
Group-bys de campo aninhados |
Group-by composto |
|
Configuração |
Adicione |
Adicione múltiplas fontes de agrupamento a |
|
Número de grupos |
Até 2.000 grupos em cada nível. |
Até 2.000 grupos por página. |
|
Número de campos |
Até três níveis de aninhamento. |
Até 32 campos. |
|
Estrutura de resposta |
Aninhada por níveis pai e filho. |
Chaves de múltiplas colunas são retornadas como uma lista plana. |
|
Paginação |
Não suportada. |
Suportada via |
|
Ordenação |
Suporta ordenação por chave de grupo, contagem de linhas ou valor de subagregação. |
Cada fonte de agrupamento suporta apenas ordenação lexicográfica por chave. A ordem padrão é decrescente. |
|
Subagregações |
Suportadas. |
Suportadas. |
|
Compatibilidade com campo de data |
As chaves de grupo usam o formato de data definido para o campo. |
As chaves de grupo de data são retornadas como strings de timestamp. |