O recurso de agregação de um índice de busca permite executar cálculos de valores e estatísticas de agrupamento nos resultados da consulta. As agregações de valor incluem valor mínimo, valor máximo, soma, média, contagem, contagem distinta e estatísticas de percentil. As agregações de agrupamento aceitam agrupamento por valor de campo, intervalo, localização geográfica, filtro, histograma e agregação composta. É possível combinar várias agregações em uma única solicitação.
O recurso de agregação é compatível com o SDK Python V5.2.1 ou superior.
Recursos
As tabelas a seguir descrevem os recursos de agregação.
Agregação de valor
|
Recurso |
Descrição |
|
Valor mínimo |
Retorna o menor valor de um campo, semelhante à função |
|
Valor máximo |
Retorna o maior valor de um campo, semelhante à função |
|
Soma |
Retorna a soma dos valores em um campo numérico, semelhante à função |
|
Média |
Retorna a média dos valores em um campo numérico, semelhante à função |
|
Contagem |
Retorna a quantidade de valores de um campo especificado ou o total de linhas em um índice de busca, semelhante à função |
|
Contagem distinta |
Retorna a quantidade de valores distintos de um campo especificado, semelhante à função |
|
Estatísticas de percentil |
Calcula a distribuição percentil de um conjunto de dados. Durante operações e manutenção (O&M) rotineiras do sistema, por exemplo, esse recurso analisa a distribuição de latências de requisição, como os valores P25, P50, P90 e P99. |
Agregação de agrupamento
Recurso | Descrição |
Agrupar por valor de campo | Agrupa os resultados da consulta com base nos valores de um campo. Linhas com o mesmo valor de campo ficam no mesmo grupo. A resposta retorna o valor de cada grupo e sua contagem de linhas. Nota Quando há muitos grupos, os resultados desta agregação podem ser aproximados. |
Agrupar por intervalo | Agrupa os resultados da consulta com base em intervalos especificados de um campo. Linhas cujos valores se enquadram no mesmo intervalo ficam no mesmo grupo. A resposta retorna a quantidade de itens em cada intervalo. |
Agrupar por localização geográfica | Agrupa os resultados da consulta com base na distância de um ponto central. Linhas dentro da mesma faixa de distância ficam no mesmo grupo. A resposta retorna a quantidade de itens em cada faixa. |
Agrupar por filtro | Agrupa os resultados da consulta com base em um conjunto de filtros. A resposta retorna a quantidade de documentos correspondentes a cada filtro. Os resultados seguem a mesma ordem de especificação dos filtros. |
Agregação de histograma | Agrupa os resultados da consulta com base em um intervalo numérico especificado. Linhas cujos valores se enquadram no mesmo intervalo ficam no mesmo grupo. A resposta retorna o valor de cada grupo e sua respectiva contagem. |
Agregação composta | Agrupa os resultados da consulta por vários campos, semelhante a |
Agregação de valor
Valor mínimo
Retorna o menor valor de um campo, semelhante à função min do SQL.
Parâmetros
|
Parâmetro |
Descrição |
|
name |
Nome personalizado da agregação, usado para recuperar o resultado. |
|
field |
Campo a agregar. O tipo de dados deve ser Long, Double ou Date. |
|
missing |
Valor padrão para documentos sem o campo especificado. Se definido, esse valor será usado na agregação. Caso contrário, documentos sem o campo serão ignorados. |
Exemplo
Calcule a pontuação mínima entre pessoas com 18 anos.
query = TermQuery('age', 18)
agg = Min('score', name='min')
search_response = client.search(table_name, index_name,
SearchQuery(query, limit=0, aggs=[agg]),
ColumnsToGet(return_type=ColumnReturnType.ALL_FROM_INDEX))
for agg_result in search_response.agg_results:
print("name: %s, value: %s" % (agg_result.name, str(agg_result.value)))
Valor máximo
Retorna o maior valor de um campo, semelhante à função max do SQL.
Parâmetros
|
Parâmetro |
Descrição |
|
name |
Nome personalizado da agregação, usado para recuperar o resultado. |
|
field |
Campo a agregar. O tipo de dados deve ser Long, Double ou Date. |
|
missing |
Valor padrão para documentos sem o campo especificado. Se definido, esse valor será usado na agregação. Caso contrário, documentos sem o campo serão ignorados. |
Exemplo
Calcule a pontuação máxima entre pessoas com 18 anos. Se uma pessoa não tiver pontuação, use o valor padrão 0.
query = TermQuery('age', 18)
agg = Max('score', missing_value=0, name='max')
search_response = client.search(table_name, index_name,
SearchQuery(query, limit=0, aggs=[agg]),
ColumnsToGet(return_type=ColumnReturnType.ALL_FROM_INDEX))
for agg_result in search_response.agg_results:
print("name: %s, value: %s" % (agg_result.name, str(agg_result.value)))
Soma
Retorna a soma dos valores em um campo numérico, semelhante à função sum do SQL.
Parâmetros
|
Parâmetro |
Descrição |
|
name |
Nome personalizado da agregação, usado para recuperar o resultado. |
|
field |
Campo a agregar. O tipo de dados deve ser Long ou Double. |
|
missing |
Valor padrão para documentos sem o campo especificado. Se definido, esse valor será usado na agregação. Caso contrário, documentos sem o campo serão ignorados. |
Exemplo
Calcule a soma de todas as pontuações para pessoas com 18 anos.
query = TermQuery('age', 18)
agg = Sum('score', name='sum')
search_response = client.search(table_name, index_name,
SearchQuery(query, limit=0, aggs=[agg]),
ColumnsToGet(return_type=ColumnReturnType.ALL_FROM_INDEX))
for agg_result in search_response.agg_results:
print("name: %s, value: %s" % (agg_result.name, str(agg_result.value)))
Média
Retorna a média dos valores em um campo numérico, semelhante à função avg do SQL.
Parâmetros
|
Parâmetro |
Descrição |
|
name |
Nome personalizado da agregação, usado para recuperar o resultado. |
|
field |
Campo a agregar. O tipo de dados deve ser Long, Double ou Date. |
|
missing |
Valor padrão para documentos sem o campo especificado. Se definido, esse valor será usado na agregação. Caso contrário, documentos sem o campo serão ignorados. |
Exemplo
Calcule a pontuação média para pessoas com 18 anos.
query = TermQuery('age', 18)
agg = Avg('score', name='avg')
search_response = client.search(table_name, index_name,
SearchQuery(query, limit=0, aggs=[agg]),
ColumnsToGet(return_type=ColumnReturnType.ALL_FROM_INDEX))
for agg_result in search_response.agg_results:
print("name: %s, value: %s" % (agg_result.name, str(agg_result.value)))
Contagem
Retorna a quantidade de valores de um campo especificado ou o total de linhas em um índice de busca, semelhante à função count do SQL.
Há duas maneiras de contar linhas correspondentes a uma consulta:
Para obter o total de linhas correspondentes, defina o parâmetro de consulta
get_total_countcomoTrue.Para contar apenas as linhas em que um campo específico tem valor (útil para colunas esparsas), use a agregação
countnesse campo.
Parâmetros
|
Parâmetro |
Descrição |
|
name |
Nome personalizado da agregação, usado para recuperar o resultado. |
|
field |
Campo a usar na agregação. O tipo de dados deve ser Long, Double, Boolean, Keyword, |
Exemplo
Conte quantas pessoas com 18 anos possuem nota de exame registrada.
query = TermQuery('age', 18)
agg = Count('score', name='count')
search_response = client.search(table_name, index_name,
SearchQuery(query, limit=0, aggs=[agg]),
ColumnsToGet(return_type=ColumnReturnType.ALL_FROM_INDEX))
for agg_result in search_response.agg_results:
print("name: %s, value: %s" % (agg_result.name, str(agg_result.value)))
Contagem distinta
Retorna a quantidade de valores distintos de um campo especificado, semelhante à função count(distinct) do SQL.
O resultado de uma contagem distinta é uma aproximação.
Quando a contagem distinta é inferior a 10.000, o resultado é quase exato.
Quando a contagem distinta atinge 100 milhões, a taxa de erro é de aproximadamente 2%.
Parâmetros
|
Parâmetro |
Descrição |
|
name |
Nome personalizado da agregação, usado para recuperar o resultado. |
|
field |
Campo a usar na agregação. O tipo de dados deve ser Long, Double, Boolean, Keyword, |
|
missing |
Valor padrão para documentos sem o campo especificado. Se definido, esse valor será usado na agregação. Caso contrário, documentos sem o campo serão ignorados. |
Exemplo
Conte quantos nomes distintos existem entre pessoas com 18 anos.
query = TermQuery('age', 18)
agg = DistinctCount('name', name='distinct_name')
search_response = client.search(table_name, index_name,
SearchQuery(query, limit=0, aggs=[agg]),
ColumnsToGet(return_type=ColumnReturnType.ALL_FROM_INDEX))
for agg_result in search_response.agg_results:
print("name: %s, value: %s" % (agg_result.name, str(agg_result.value)))
Estatísticas de percentil
Calcula a distribuição percentil de um conjunto de dados. Durante O&M rotineiro do sistema, por exemplo, utilize este recurso para analisar a distribuição de latências de requisição, como os valores P25, P50, P90 e P99.
As estatísticas de percentil são aproximações. A precisão é maior para percentis nas extremidades da distribuição (como 1% e 99%) do que para aqueles no meio (como 50%).
Parâmetros
|
Parâmetro |
Descrição |
|
name |
Nome personalizado da agregação, usado para recuperar o resultado. |
|
field |
Campo a usar na agregação. O tipo de dados deve ser Long, Double ou Date. |
|
percentiles |
Lista de valores de percentil, como |
|
missing_value |
Valor padrão para documentos sem o campo especificado. Se definido, esse valor será usado na agregação. Caso contrário, documentos sem o campo serão ignorados. |
Exemplo
query = TermQuery('product', '10010')
agg = Percentiles('latency', percentiles_list=[50, 90, 95])
search_response = client.search(table_name, index_name,
SearchQuery(query, limit=0, aggs=[agg]),
ColumnsToGet(return_type=ColumnReturnType.ALL_FROM_INDEX))
for agg_result in search_response.agg_results:
print("name: %s" % agg_result.name)
for item in agg_result.value:
print(" percentile: %s, value: %s" % (str(item.key), str(item.value)))
Agregação de agrupamento
Agrupar por valor de campo
Agrupa os resultados da consulta com base nos valores de um campo. Linhas com o mesmo valor de campo ficam no mesmo grupo. A resposta retorna o valor de cada grupo e sua contagem de linhas.
Quando há muitos grupos, os resultados desta agregação podem ser aproximados.
Parâmetros
|
Parâmetro |
Descrição |
|
name |
Nome personalizado da agregação, usado para recuperar o resultado. |
|
field |
Campo pelo qual agrupar. O tipo de dados deve ser Long, Double, Boolean, Keyword ou Date. |
|
size |
Quantidade de grupos a retornar. O valor padrão é 10 e o máximo é 2.000. Se houver mais de 2.000 grupos, apenas os primeiros 2.000 serão retornados. |
|
group_by_sort |
Regra de classificação dos grupos retornados. Por padrão, os grupos são classificados por contagem de linhas em ordem decrescente. Se houver várias regras, elas serão aplicadas sequencialmente. Classifique por chave de grupo em ordem lexicográfica, por contagem de linhas ou pelo resultado de uma subagregação em ordem crescente ou decrescente. |
|
sub_aggs e sub_group_bys |
Subagregações e sub-group-bys que executam análises adicionais sobre os dados agrupados. Após agrupar produtos por categoria, por exemplo, adicione subagregações |
Exemplo 1
Agrupe pessoas com 18 anos por pontuação e recupere as 10 pontuações mais comuns e a quantidade de pessoas para cada pontuação.
query = TermQuery('age', 18)
group_by = GroupByField('score', size=10)
search_response = client.search(table_name, index_name,
SearchQuery(query, limit=0, group_bys=[group_by]),
ColumnsToGet(return_type=ColumnReturnType.ALL_FROM_INDEX))
for group_by_result in search_response.group_by_results:
print("name: %s" % group_by_result.name)
for item in group_by_result.items:
print(" key: %s, count: %d" % (item.key, item.row_count))
Exemplo 2
Agrupe pessoas com 18 anos por pontuação e recupere as duas pontuações menos comuns e a quantidade de pessoas para cada pontuação.
group_by = GroupByField('score', size=2, group_by_sort=[RowCountSort(sort_order=SortOrder.ASC)])
search_response = client.search(table_name, index_name,
SearchQuery(TermQuery('age', 18), limit=0, get_total_count=True, group_bys=[group_by]),
ColumnsToGet(return_type=ColumnReturnType.ALL_FROM_INDEX))
for group_by_result in search_response.group_by_results:
print("name: %s" % group_by_result.name)
for item in group_by_result.items:
print(" key: %s, count: %d" % (item.key, item.row_count))
Exemplo 3
Agrupe pessoas com 18 anos por pontuação, recupere as duas pontuações mais comuns e suas contagens e obtenha informações sobre os três principais indivíduos em cada grupo, classificados por chave primária.
sort = RowCountSort(sort_order=SortOrder.DESC)
sub_agg = [TopRows(limit=3, sort=Sort([PrimaryKeySort(sort_order=SortOrder.DESC)]), name='top_rows')]
group_by = GroupByField('score', size=2, group_by_sort=[sort], sub_aggs=sub_agg)
search_response = client.search(table_name, index_name,
SearchQuery(TermQuery('age', 18), limit=0, get_total_count=True, group_bys=[group_by]),
ColumnsToGet(return_type=ColumnReturnType.ALL_FROM_INDEX))
for group_by_result in search_response.group_by_results:
print("name: %s" % group_by_result.name)
for item in group_by_result.items:
print(" key: %s, count: %d" % (item.key, item.row_count))
for sub_agg in item.sub_aggs:
print(" sub_agg: %s" % sub_agg.name)
for entry in sub_agg.value:
print(" value: %s" % str(entry))
Exemplo 4
Agrupe pessoas com 18 anos por pontuação e gênero.
sort = RowCountSort(sort_order=SortOrder.ASC)
sub_group = GroupByField('sex', size=10, group_by_sort=[sort])
group_by = GroupByField('score', size=10, group_by_sort=[sort], sub_group_bys=[sub_group])
search_response = client.search(table_name, index_name,
SearchQuery(TermQuery('age', 18), limit=0, get_total_count=True, group_bys=[group_by]),
ColumnsToGet(return_type=ColumnReturnType.ALL_FROM_INDEX))
for group_by_result in search_response.group_by_results:
print("name: %s" % group_by_result.name)
for item in group_by_result.items:
print(" key: %s, count: %d" % (item.key, item.row_count))
for sub_group in item.sub_group_bys:
print(" sub_group: %s" % sub_group.name)
for sub_item in sub_group.items:
print(" key: %s, count: %s" % (str(sub_item.key), str(sub_item.row_count)))
Agrupar por intervalo
Agrupa os resultados da consulta com base em intervalos especificados de um campo. Linhas cujos valores se enquadram no mesmo intervalo ficam no mesmo grupo. A resposta retorna a contagem de itens em cada intervalo.
Parâmetros
|
Parâmetro |
Descrição |
|
name |
Nome personalizado da agregação, usado para recuperar o resultado. |
|
field |
Campo pelo qual agrupar. O tipo de dados deve ser Long ou Double. |
|
range[double_from, double_to) |
Intervalo para agrupamento. Os valores inicial e final podem representar infinito negativo e positivo. |
|
sub_aggs e sub_group_bys |
Subagregações e sub-group-bys que executam análises adicionais sobre os dados agrupados. Para descobrir qual província contribui mais para as vendas dentro de uma determinada faixa de volume, por exemplo, agrupe por volume de vendas e adicione um |
Exemplo
Conte quantas pessoas com 18 anos têm pontuações nos intervalos [80, 90) e [90, 100).
query = TermQuery('age', 18)
group_by = GroupByRange(field_name='score', ranges=[(80, 90), (90, 100)])
search_response = client.search(table_name, index_name,
SearchQuery(query, limit=0, group_bys=[group_by]),
ColumnsToGet(return_type=ColumnReturnType.ALL_FROM_INDEX))
for group_by_result in search_response.group_by_results:
print("name: %s" % group_by_result.name)
for item in group_by_result.items:
print(" range: %.1f~%.1f, count: %d" % (item.range_from, item.range_to, item.row_count))
Agrupar por localização geográfica
Agrupa os resultados da consulta com base na distância de um ponto central. Linhas dentro da mesma faixa de distância ficam no mesmo grupo. A resposta retorna a contagem de itens em cada faixa.
Parâmetros
|
Parâmetro |
Descrição |
|
name |
Nome personalizado da agregação, usado para recuperar o resultado. |
|
field |
O campo deve ser do tipo |
|
origin(double lat, double lon) |
Latitude e longitude do ponto central. |
|
range[double_from, double_to) |
Intervalo para agrupamento, em metros. Os valores inicial e final podem representar infinito negativo e positivo. |
|
sub_aggs e sub_group_bys |
Subagregações e sub-group-bys que executam análises adicionais sobre os dados agrupados. |
Exemplo
Conte quantas pessoas com 18 anos moram a até 1 quilômetro e entre 1 e 2 quilômetros da escola. As coordenadas da escola são (31, 116).
query = TermQuery('age', 18)
group_by = GroupByGeoDistance(field_name='address', origin=GeoPoint(31, 116), ranges=[(0, 1000), (1000, 2000)])
search_response = client.search(table_name, index_name,
SearchQuery(query, limit=0, group_bys=[group_by]),
ColumnsToGet(return_type=ColumnReturnType.ALL_FROM_INDEX))
for group_by_result in search_response.group_by_results:
print("name: %s" % group_by_result.name)
for item in group_by_result.items:
print(" range: %.1f~%.1f, count: %d" % (item.range_from, item.range_to, item.row_count))
Agrupar por filtro
Agrupa os resultados da consulta com base em um conjunto de filtros. A resposta retorna a quantidade de documentos correspondentes a cada filtro. Os resultados seguem a mesma ordem de especificação dos filtros.
Parâmetros
|
Parâmetro |
Descrição |
|
name |
Nome personalizado da agregação, usado para recuperar o resultado. |
|
filter |
Condições de filtro. Os resultados seguem a mesma ordem de especificação dos filtros. |
|
sub_aggs e sub_group_bys |
Subagregações e sub-group-bys que executam análises adicionais sobre os dados agrupados. |
Exemplo
Conte quantas pessoas com 18 anos tiraram 100 em matemática e quantas tiraram 100 em chinês.
query = TermQuery('age', 18)
filter1 = TermQuery('math', 100)
filter2 = TermQuery('chinese', 100)
filters = [filter1, filter2]
group_by = GroupByFilter(filters)
search_response = client.search(table_name, index_name,
SearchQuery(query, limit=0, group_bys=[group_by]),
ColumnsToGet(return_type=ColumnReturnType.ALL_FROM_INDEX))
for group_by_result in search_response.group_by_results:
print("name: %s" % group_by_result.name)
i = 0
for item in group_by_result.items:
print(" filter: %s=%s, count: %d" % (str(filters[i].field_name), str(filters[i].column_value), item.row_count))
i += 1
Agregação de histograma
Agrupa os resultados da consulta com base em um intervalo numérico especificado. Linhas cujos valores se enquadram no mesmo intervalo ficam no mesmo grupo. A resposta retorna cada intervalo e sua respectiva contagem de documentos.
Parâmetros
|
Parâmetro |
Descrição |
|
name |
Nome personalizado da agregação, usado para recuperar o resultado. |
|
field |
Campo a usar na agregação. O tipo de dados deve ser Long ou Double. |
|
interval |
Intervalo da agregação. |
|
field_range[min,max] |
Faixa da agregação. Este parâmetro funciona com |
|
min_doc_count |
Contagem mínima de documentos para incluir um grupo nos resultados. Grupos com menos documentos que esse valor são omitidos. |
|
missing_value |
Valor padrão para documentos sem o campo especificado. Se definido, esse valor será usado na agregação. Caso contrário, documentos sem o campo serão ignorados. |
Exemplo
query = TermQuery('product', '10010')
group_by = GroupByHistogram(field_name='latency', interval=100, field_range=FieldRange(0, 10000), missing_value=0)
search_response = client.search(table_name, index_name,
SearchQuery(query, limit=0, group_bys=[group_by]),
ColumnsToGet(return_type=ColumnReturnType.ALL_FROM_INDEX))
for group_by_result in search_response.group_by_results:
print("name: %s" % group_by_result.name)
for item in group_by_result.items:
print(" key: %s, value: %s" % (item.key, item.value))
Agregação composta
A agregação composta agrupa os resultados da consulta com base em vários campos, semelhante à cláusula GROUP BY coluna1, coluna2, ... em SQL. Diferente do agrupamento por valor de campo, a agregação composta aceita agrupamento em várias fontes simultaneamente e oferece paginação para recuperar todos os resultados agrupados. São permitidas no máximo 32 fontes em sources.
O SDK Python 6.4.4 ou superior suporta agregação composta.
Parâmetros
Parâmetro | Descrição |
name | Nome personalizado da agregação, usado para distinguir diferentes agregações e obter seus resultados correspondentes. O valor padrão é |
sources | Lista de fontes. Vários tipos de GroupBy, como Nota
|
size | Quantidade de grupos a retornar em cada resposta. Parâmetro opcional com valor padrão de 10 e máximo de 2000. Controla precisamente a quantidade de grupos retornados. Se o valor especificado exceder o máximo, o servidor retornará um erro. Não especifique este parâmetro simultaneamente com |
next_token | Próximo token. Não é necessário defini-lo na primeira solicitação. Nas solicitações subsequentes, use o |
suggested_size | Quantidade sugerida de grupos. Parâmetro opcional que aceita qualquer inteiro positivo ou -1. No modo de sugestão, se o valor exceder o máximo (2000), ele será ajustado automaticamente para o limite sem gerar erro. O valor -1 também assume o máximo como padrão. Adequado para cenários como exploração de dados e processamento em lote, onde se deseja recuperar o máximo de dados possível sem acionar erros de limite. Não especifique este parâmetro simultaneamente com |
sub_aggs e sub_group_bys | Subagregações e sub-group-bys que executam análises adicionais sobre os dados agrupados. |
No resultado retornado, as
keysde cada grupo formam uma lista de strings correspondente às fontes. Quando o valor do campo de uma fonte estiver vazio, o valor na posição correspondente emkeysseráNone.Se houver muitos grupos, defina o parâmetro
sizeousuggested_sizee usenext_tokenpara paginar os resultados, evitando retorno excessivo de dados. Quando onext_tokenna resposta forNone, todos os resultados de grupo foram recuperados.
Exemplo 1
Agrupe pessoas com 18 anos pelo campo score e obtenha a quantidade de linhas para cada valor de pontuação.
query = TermQuery('age', 18)
# When a GroupByField is used as a source, you only need to specify the field_name and name parameters. The size parameter cannot be set.
source = GroupByField('score', name='group_by_score')
group_by = GroupByComposite(sources=[source])
search_response = client.search(table_name, index_name,
SearchQuery(query, limit=0, get_total_count=True, group_bys=[group_by]),
ColumnsToGet(return_type=ColumnReturnType.NONE))
for group_by_result in search_response.group_by_results:
print("name: %s" % group_by_result.name)
print("source_names: %s" % str(group_by_result.source_group_by_names))
for item in group_by_result.items:
print(" keys: %s, count: %d" % (str(item.keys), item.row_count))
Exemplo 2
Agrupe pelos campos score e sex para indivíduos com 18 anos e obtenha a quantidade de linhas para cada combinação de pontuação e sexo.
query = TermQuery('age', 18)
source1 = GroupByField('score', name='group_by_score')
source2 = GroupByField('sex', name='group_by_sex')
group_by = GroupByComposite(sources=[source1, source2])
search_response = client.search(table_name, index_name,
SearchQuery(query, limit=0, get_total_count=True, group_bys=[group_by]),
ColumnsToGet(return_type=ColumnReturnType.NONE))
for group_by_result in search_response.group_by_results:
print("name: %s" % group_by_result.name)
print("source_names: %s" % str(group_by_result.source_group_by_names))
for item in group_by_result.items:
# The keys parameter is a list of strings that corresponds to the sources in order. If a field value is empty, the corresponding element is None.
print(" keys: %s, count: %d" % (str(item.keys), item.row_count))
Exemplo 3
Use next_token para recuperar todos os resultados agrupados de forma paginada. Os resultados são agrupados pelo campo score. Recupere 2 grupos por vez para obter todos os resultados via paginação.
query = TermQuery('age', 18)
source = GroupByField('score')
group_by = GroupByComposite(sources=[source], size=2)
# Initial request
search_response = client.search(table_name, index_name,
SearchQuery(query, limit=0, get_total_count=True, group_bys=[group_by]),
ColumnsToGet(return_type=ColumnReturnType.NONE))
group_by_result = search_response.group_by_results[0]
all_items = list(group_by_result.items)
# Paginate to retrieve the remaining results. The operation is complete when next_token is None.
while group_by_result.next_token is not None:
group_by = GroupByComposite(sources=[source], size=2, next_token=group_by_result.next_token)
search_response = client.search(table_name, index_name,
SearchQuery(query, limit=0, get_total_count=True, group_bys=[group_by]),
ColumnsToGet(return_type=ColumnReturnType.NONE))
group_by_result = search_response.group_by_results[0]
all_items.extend(group_by_result.items)
# Print all the grouped results.
for item in all_items:
print("keys: %s, count: %d" % (str(item.keys), item.row_count))
Exemplo 4
Utilize uma subagregação para agrupar dados pelo campo score e calcular o valor máximo de score para cada grupo.
query = TermQuery('age', 18)
source = GroupByField('score')
sub_agg = Max('score')
group_by = GroupByComposite(sources=[source], sub_aggs=[sub_agg])
search_response = client.search(table_name, index_name,
SearchQuery(query, limit=0, get_total_count=True, group_bys=[group_by]),
ColumnsToGet(return_type=ColumnReturnType.NONE))
for group_by_result in search_response.group_by_results:
print("name: %s" % group_by_result.name)
for item in group_by_result.items:
print(" keys: %s, count: %d" % (str(item.keys), item.row_count))
for sub_agg in item.sub_aggs:
print(" sub_agg: %s, value: %s" % (sub_agg.name, str(sub_agg.value)))