Todos os produtos
Search
Central de documentação

Tablestore:Agregação

Última atualização: Jun 30, 2026

Este tópico explica como executar operações de agregação para análise de dados. Essas operações calculam valores mínimos, máximos, somas, médias, contagens, contagens distintas e percentis. É possível agrupar os resultados por valor de campo, intervalo, localização geográfica, filtros, histogramas ou datas, além de executar consultas aninhadas para analisar as linhas de cada grupo. Também é permitido combinar várias operações de agregação para criar consultas mais complexas.

Procedimento

A figura a seguir ilustra o procedimento completo de agregação.

fig_agg_pro

O servidor consulta os dados que atendem às condições especificadas e executa a agregação com base na solicitação. Por isso, solicitações que exigem agregação têm processamento mais complexo do que aquelas sem essa necessidade.

Recursos

A agregação oferece diversos recursos semelhantes às funções SQL, como MIN() para obter o valor mínimo, MAX() para o valor máximo, SUM() para a soma, AVG() para a média, COUNT() para contar linhas, COUNT(DISTINCT) para contar valores distintos, ANY_VALUE() para consultar linhas obtidas dos resultados de agregação em cada grupo e GROUP BY para agrupar resultados. Além disso, você pode obter estatísticas de percentil, agrupar resultados por valor de campo, intervalo, localização geográfica, filtro, histograma ou histograma de data, agrupar com base em vários campos e realizar consultas aninhadas. A tabela a seguir descreve esses recursos.

Recurso

Descrição

Valor mínimo

Retorna o valor mínimo de um campo. Funciona de maneira semelhante à função MIN do SQL.

Valor máximo

Retorna o valor máximo de um campo. Funciona de maneira semelhante à função MAX do SQL.

Soma

Retorna a soma de todos os valores de um campo numérico. Funciona de maneira semelhante à função SUM do SQL.

Valor médio

Retorna a média de todos os valores de um campo numérico. Funciona de maneira semelhante à função AVG do SQL.

Contagem

Retorna o número total de valores de um campo ou o total de linhas em um índice de pesquisa. Funciona de maneira semelhante à função COUNT do SQL.

Contagem distinta

Retorna o número de valores distintos de um campo. Funciona de maneira semelhante à função COUNT(DISTINCT) do SQL.

Estatísticas de percentil

Um valor de percentil indica a posição relativa de um valor dentro de um conjunto de dados. Por exemplo, ao coletar estatísticas sobre o tempo de resposta de cada requisição durante a operação e manutenção (O&M) rotineira do sistema, analise a distribuição do tempo de resposta usando percentis como p25, p50, p90 e p99.

Agrupamento por valor de campo

Agrupa os resultados da consulta com base nos valores dos campos. Valores idênticos são reunidos no mesmo grupo. O sistema retorna o valor de cada grupo e a quantidade de ocorrências desse valor.

Aninhamento em GroupBy

O GroupBy suporta aninhamento. Use esse recurso para executar subagregações.

Agrupamento por vários campos

Agrupa os resultados da consulta com base em múltiplos campos. Tokens permitem realizar paginação.

Agrupamento por intervalo

Agrupa os resultados da consulta com base em intervalos de valores de um campo. Valores dentro de um intervalo específico formam um grupo. O sistema retorna a quantidade de valores em cada intervalo.

Agrupamento por localização geográfica

Agrupa os resultados da consulta com base na distância entre locais geográficos e um ponto central. Resultados dentro de faixas de distância específicas formam grupos. O sistema retorna a quantidade de valores em cada faixa.

Agrupamento por filtro

Filtra os resultados da consulta e os agrupa para obter a quantidade de correspondências de cada filtro. Os resultados seguem a ordem de definição dos filtros.

Consulta por histograma

Agrupa os resultados da consulta com base em intervalos de dados específicos. Valores de campo dentro do mesmo intervalo formam um grupo. O sistema retorna o intervalo de valores e a quantidade de itens de cada grupo.

Consulta por histograma de data

Agrupa os resultados da consulta com base em intervalos de data específicos. Valores de campo dentro do mesmo intervalo formam um grupo. O sistema retorna o intervalo de valores e a quantidade de itens de cada grupo.

Consulta das linhas obtidas dos resultados de agregação em cada grupo

Após agrupar os resultados da consulta, consulte as linhas de cada grupo. Este método funciona de maneira semelhante à função ANY_VALUE(campo) do MySQL.

Múltiplas agregações

Execute várias operações de agregação simultaneamente.

Nota

A execução simultânea de múltiplas agregações complexas pode demandar muito tempo de processamento.

Pré-requisitos

Valor mínimo

Retorna o valor mínimo de um campo. Funciona de maneira semelhante à função MIN do SQL.

  • Parâmetros

    Parâmetro

    Descrição

    AggName

    Nome exclusivo da operação de agregação. Use este nome para consultar os resultados de uma agregação específica.

    FieldName

    Nome do campo usado na operação de agregação. Apenas os tipos LONG, DOUBLE e DATE são suportados.

    Missing

    Valor padrão assumido pelo campo quando uma linha possui valor vazio durante a agregação.

    • Se nenhum valor for definido para Missing, a linha será ignorada.

    • Se um valor for definido para Missing, o sistema usará esse parâmetro como valor do campo na linha.

  • Exemplo

    /// <summary>
    /// Minimum value. 
    /// </summary>
    /// <param name="otsClient"></param>
    public static void MinAggregation(OTSClient otsClient)
    {
        MinAggregation minAggregation = new MinAggregation();
        minAggregation.AggName = "Min_Agg";
        minAggregation.FieldName = "pk1";
    
        RangeQuery rangeQuery = new RangeQuery();
        rangeQuery.FieldName = "pk1";
        rangeQuery.From = new ColumnValue(0);
        rangeQuery.To = new ColumnValue(100);
    
        SearchQuery seachQuery = new SearchQuery
        {
            Limit = 0,
            Query = rangeQuery,
            AggregationList = new List<IAggregation>
            {
                minAggregation
            }
        };
    
        SearchRequest searchRequest = new SearchRequest(TableName, IndexName, seachQuery);
    
        SearchResponse searchResponse = otsClient.Search(searchRequest);
    
        Console.WriteLine(JsonConvert.SerializeObject(searchResponse.AggregationResults.GetAsMinAggregationResult("Min_Agg")));
    }

Valor máximo

Retorna o valor máximo de um campo. Funciona de maneira semelhante à função MAX do SQL.

  • Parâmetros

    Parâmetro

    Descrição

    AggName

    Nome exclusivo da operação de agregação. Use este nome para consultar os resultados de uma agregação específica.

    FieldName

    Nome do campo usado na operação de agregação. Apenas os tipos LONG, DOUBLE e DATE são suportados.

    Missing

    Valor padrão assumido pelo campo quando uma linha possui valor vazio durante a agregação.

    • Se nenhum valor for definido para Missing, a linha será ignorada.

    • Se um valor for definido para Missing, o sistema usará esse parâmetro como valor do campo na linha.

  • Exemplo

    /// <summary>
    /// Maximum value. 
    /// </summary>
    /// <param name="otsClient"></param>
    public static void MaxAggregation(OTSClient otsClient)
    {
        MaxAggregation maxAggregation = new MaxAggregation();
        maxAggregation.AggName = "Max_Agg";
        maxAggregation.FieldName = "pk1";
    
        RangeQuery rangeQuery = new RangeQuery();
        rangeQuery.FieldName = "pk1";
        rangeQuery.From = new ColumnValue(0);
        rangeQuery.To = new ColumnValue(100);
    
        SearchQuery seachQuery = new SearchQuery
        {
            Limit = 0,
            Query = rangeQuery,
            AggregationList = new List<IAggregation>
            {
                maxAggregation
            }
        };
    
        SearchRequest searchRequest = new SearchRequest(TableName, IndexName, seachQuery);
    
        SearchResponse searchResponse = otsClient.Search(searchRequest);
    
        Console.WriteLine(JsonConvert.SerializeObject(searchResponse.AggregationResults.GetAsMaxAggregationResult("Max_Agg")));
    }

Soma

Retorna a soma de todos os valores de um campo numérico. Funciona de maneira semelhante à função SUM do SQL.

  • Parâmetros

    Parâmetro

    Descrição

    AggName

    Nome exclusivo da operação de agregação. Use este nome para consultar os resultados de uma agregação específica.

    FieldName

    Nome do campo usado na operação de agregação. Apenas os tipos LONG e DOUBLE são suportados.

    Missing

    Valor padrão assumido pelo campo quando uma linha possui valor vazio durante a agregação.

    • Se nenhum valor for definido para Missing, a linha será ignorada.

    • Se um valor for definido para Missing, o sistema usará esse parâmetro como valor do campo na linha.

  • Exemplo

    /// <summary>
    /// Sum. 
    /// </summary>
    /// <param name="otsClient"></param>
    public static void SumAggregation(OTSClient otsClient)
    {
        SumAggregation sumAggregation = new SumAggregation();
        sumAggregation.AggName = "Sum_Agg";
        sumAggregation.FieldName = "pk1";
    
        RangeQuery rangeQuery = new RangeQuery();
        rangeQuery.FieldName = "pk1";
        rangeQuery.From = new ColumnValue(0);
        rangeQuery.To = new ColumnValue(100);
    
        SearchQuery seachQuery = new SearchQuery
        {
            Limit = 0,
            Query = rangeQuery,
            AggregationList = new List<IAggregation>
            {
                sumAggregation
            }
        };
    
        SearchRequest searchRequest = new SearchRequest(TableName, IndexName, seachQuery);
    
        SearchResponse searchResponse = otsClient.Search(searchRequest);
    
        Console.WriteLine(JsonConvert.SerializeObject(searchResponse.AggregationResults.GetAsSumAggregationResult("Sum_Agg")));
    }

Valor médio

Retorna a média de todos os valores de um campo numérico. Funciona de maneira semelhante à função AVG do SQL.

  • Parâmetros

    Parâmetro

    Descrição

    AggName

    Nome exclusivo da operação de agregação. Use este nome para consultar os resultados de uma agregação específica.

    FieldName

    Nome do campo usado na operação de agregação. Apenas os tipos LONG, DOUBLE e DATE são suportados.

    Missing

    Valor padrão assumido pelo campo quando uma linha possui valor vazio durante a agregação.

    • Se nenhum valor for definido para Missing, a linha será ignorada.

    • Se um valor for definido para Missing, o sistema usará esse parâmetro como valor do campo na linha.

  • Exemplo

    /// <summary>
    /// Average value. 
    /// </summary>
    /// <param name="otsClient"></param>
    public static void AvgAggregation(OTSClient otsClient)
    {
        AvgAggregation avgAggregation = new AvgAggregation();
        avgAggregation.AggName = "Avg_Agg";
        avgAggregation.FieldName = "pk1";
    
        RangeQuery rangeQuery = new RangeQuery();
        rangeQuery.FieldName = "pk1";
        rangeQuery.From = new ColumnValue(0);
        rangeQuery.To = new ColumnValue(100);
    
        SearchQuery seachQuery = new SearchQuery
        {
            Limit = 0,
            Query = rangeQuery,
            AggregationList = new List<IAggregation>
            {
                avgAggregation
            }
        };
    
        SearchRequest searchRequest = new SearchRequest(TableName, IndexName, seachQuery);
    
        SearchResponse searchResponse = otsClient.Search(searchRequest);
    
        Console.WriteLine(JsonConvert.SerializeObject(searchResponse.AggregationResults.GetAsAvgAggregationResult("Avg_Agg")));
    }

Contagem

Retorna o número total de valores de um campo especificado ou o total de linhas em um índice de pesquisa. Funciona de maneira semelhante à função COUNT do SQL.

Nota

Use os métodos abaixo para consultar o total de linhas em um índice de pesquisa ou o total de linhas que atendem às condições da consulta:

  • Utilize o recurso de contagem da agregação e especifique count(*) na solicitação.

  • Utilize o recurso de consulta para obter o número de linhas correspondentes. Defina setGetTotalCount como true na consulta. Use MatchAllQuery para obter o total de linhas do índice de pesquisa.

Para consultar a quantidade de linhas que contêm uma coluna específica no índice de pesquisa, use o nome dessa coluna como valor da expressão de contagem. Essa abordagem é ideal para cenários com colunas esparsas.

  • Parâmetros

    Parâmetro

    Descrição

    AggName

    Nome exclusivo da operação de agregação. Use este nome para consultar os resultados de uma agregação específica.

    FieldName

    Nome do campo usado na operação de agregação. Apenas os tipos LONG, DOUBLE, BOOLEAN, KEYWORD, GEO_POINT e DATE são suportados.

  • Exemplo

    /// <summary>
    /// Count. 
    /// </summary>
    /// <param name="otsClient"></param>
    public static void CountAggregation(OTSClient otsClient)
    {
        CountAggregation countAggregation = new CountAggregation();
        countAggregation.AggName = "Count_Agg";
        countAggregation.FieldName = "pk1";
    
        RangeQuery rangeQuery = new RangeQuery();
        rangeQuery.FieldName = "pk1";
        rangeQuery.From = new ColumnValue(0);
        rangeQuery.To = new ColumnValue(100);
    
        SearchQuery seachQuery = new SearchQuery
        {
            Limit = 0,
            Query = rangeQuery,
            AggregationList = new List<IAggregation>
            {
                countAggregation
            }
        };
    
        SearchRequest searchRequest = new SearchRequest(TableName, IndexName, seachQuery);
    
        SearchResponse searchResponse = otsClient.Search(searchRequest);
    
        Console.WriteLine(JsonConvert.SerializeObject(searchResponse.AggregationResults.GetAsCountAggregationResult("Count_Agg")));
    }

Contagem distinta

Retorna o número de valores distintos de um campo. Funciona de maneira semelhante à função COUNT(DISTINCT) do SQL.

Nota

O número de valores distintos é uma aproximação.

  • Se o total de linhas antes da aplicação da contagem distinta for inferior a 10.000, o resultado calculado ficará próximo do valor exato.

  • Se o total de linhas antes da aplicação da contagem distinta for igual ou superior a 100 milhões, a margem de erro será de aproximadamente 2%.

  • Parâmetros

    Parâmetro

    Descrição

    AggName

    Nome exclusivo da operação de agregação. Use este nome para consultar os resultados de uma agregação específica.

    FieldName

    Nome do campo usado na operação de agregação. Apenas os tipos LONG, DOUBLE, BOOLEAN, KEYWORD, GEO_POINT e DATE são suportados.

    Missing

    Valor padrão assumido pelo campo quando uma linha possui valor vazio durante a agregação.

    • Se nenhum valor for definido para Missing, a linha será ignorada.

    • Se um valor for definido para Missing, o sistema usará esse parâmetro como valor do campo na linha.

  • Exemplo

    /// <summary>
    /// Distinct count. 
    /// </summary>
    /// <param name="otsClient"></param>
    public static void DistinctCountAggregation(OTSClient otsClient)
    {
        DistinctCountAggregation distinctCountAggregation = new DistinctCountAggregation();
        distinctCountAggregation.AggName = "DistinctCount_Agg";
        distinctCountAggregation.FieldName = "pk1";
    
        TermsQuery termsQuery = new TermsQuery();
        termsQuery.FieldName = "pk0";
        termsQuery.Terms = new List<ColumnValue>
        {
            new ColumnValue("Sample"),
            new ColumnValue("SearchIndex")
        };
    
        SearchQuery seachQuery = new SearchQuery
        {
            Limit = 0,
            Query = termsQuery,
            AggregationList = new List<IAggregation>
            {
                distinctCountAggregation
            }
        };
    
        SearchRequest searchRequest = new SearchRequest(TableName, IndexName, seachQuery);
    
        SearchResponse searchResponse = otsClient.Search(searchRequest);
    
        Console.WriteLine(JsonConvert.SerializeObject(searchResponse.AggregationResults.GetAsDistinctCountAggregationResult("DistinctCount_Agg")));
    }

Estatísticas de percentil

Um valor de percentil indica a posição relativa de um valor dentro de um conjunto de dados. Por exemplo, ao coletar estatísticas sobre o tempo de resposta de cada requisição durante a operação e manutenção (O&M) rotineira do sistema, analise a distribuição do tempo de resposta usando percentis como p25, p50, p90 e p99.

  • Parâmetros

    Parâmetro

    Descrição

    AggName

    Nome exclusivo da operação de agregação. Use este nome para consultar os resultados de uma agregação específica.

    FieldName

    Nome do campo usado na operação de agregação. Apenas os tipos LONG, DOUBLE e DATE são suportados.

    Percentiles

    Os percentis desejados, como p50, p90 e p99. Especifique um ou mais valores.

    Missing

    Valor padrão assumido pelo campo quando uma linha possui valor vazio durante a agregação.

    • Se nenhum valor for definido para Missing, a linha será ignorada.

    • Se um valor for definido para Missing, o sistema usará esse parâmetro como valor do campo na linha.

  • Exemplo

    /// <summary>
    /// Percentile statistics. 
    /// </summary>
    /// <param name="otsClient"></param>
    public static void PercentilesAggregation(OTSClient otsClient)
    {
        PercentilesAggregation percentilesAggregation = new PercentilesAggregation();
        percentilesAggregation.AggName = "Percentiles_Agg";
        percentilesAggregation.FieldName = "pk1";
        percentilesAggregation.Missing = new ColumnValue(10);
        percentilesAggregation.Percentiles = new List<double> { 10.0, 30.0, 60.0, 90.0, 100.0 };
    
        MatchAllQuery matchAllQuery = new MatchAllQuery();
    
        SearchQuery searchQuery = new SearchQuery();
        searchQuery.AggregationList = new List<IAggregation> { percentilesAggregation };
        searchQuery.Query = matchAllQuery;
        searchQuery.Limit = 0;
    
        SearchRequest searchRequest = new SearchRequest(TableName, IndexName, searchQuery);
    
        SearchResponse searchResponse = otsClient.Search(searchRequest);
    
        Console.WriteLine(JsonConvert.SerializeObject(searchResponse));
    }

Agrupamento por valor de campo

Agrupa os resultados da consulta com base nos valores dos campos. Valores idênticos são reunidos no mesmo grupo. O sistema retorna o valor de cada grupo e a quantidade de ocorrências desse valor.

Nota

O número calculado pode divergir do valor real se a quantidade de valores em um grupo for extremamente alta.

  • Parâmetros

    Parâmetro

    Descrição

    GroupByName

    Nome exclusivo da operação de agregação. Use este nome para consultar os resultados de uma agregação específica.

    FieldName

    Nome do campo usado na operação de agregação. Apenas os tipos LONG, DOUBLE, BOOLEAN, KEYWORD e DATE são suportados.

    Size

    Quantidade de grupos a serem retornados. Valor padrão: 10. Valor máximo: 2000. Se houver mais de 2.000 grupos, apenas os primeiros 2.000 serão retornados.

    GroupBySorters

    Regras de ordenação dos grupos. Por padrão, a classificação segue a quantidade de itens em ordem decrescente. Se houver múltiplas regras, a ordenação respeitará a sequência de configuração. Parâmetros suportados:

    • Ordenar por valor em ordem alfabética.

    • Ordenar por valor em ordem alfabética inversa.

    • Ordenar por contagem de linhas em ordem crescente.

    • Ordenar por contagem de linhas em ordem decrescente.

    • Ordenar pelos valores obtidos nos resultados da subagregação em ordem crescente.

    • Ordenar pelos valores obtidos nos resultados da subagregação em ordem decrescente.

    SubAggregation e SubGroupBy

    Operação de subagregação executada com base nos resultados do agrupamento.

    • Cenário

      Consultar a quantidade de produtos por categoria, além dos preços máximo e mínimo em cada uma.

    • Métodos

      Agrupe os resultados da consulta por categoria de produto para obter a contagem por categoria. Em seguida, execute duas subagregações para obter os preços máximo e mínimo de cada categoria.

    • Resultado de exemplo

      • Frutas: 5. Preço máximo de USD 2. Preço mínimo de USD 0,5.

      • Artigos de higiene: 10. Preço máximo de USD 13. Preço mínimo de USD 0,1.

      • Dispositivos eletrônicos: 3. Preço máximo de USD 1.160. Preço mínimo de USD 310.

      • Outros produtos: 15. Preço máximo de USD 130. Preço mínimo de USD 11.

  • Exemplo

    /// <summary>
    /// Group by field value. 
    /// </summary>
    /// <param name="otsClient"></param>
    public static void GroupByField(OTSClient otsClient)
    {
        GroupByField groupByField = new GroupByField
        {
            GroupByName = "GroupBy_Field",
            FieldName = "pk0",
            GroupBySorters = new List<GroupBySorter>{
                new GroupBySorter()
                {
                    RowCountSort = new RowCountSort{ Order = SortOrder.DESC }
                },
                new GroupBySorter()
                {
                    GroupKeySort = new GroupKeySort{ Order = SortOrder.DESC }
                }
            }
        };
    
        MatchAllQuery matchAllQuery = new MatchAllQuery();
    
        SearchQuery searchQuery = new SearchQuery();
        searchQuery.GroupByList = new List<IGroupBy> { groupByField };
        searchQuery.Query = matchAllQuery;
        searchQuery.Limit = 0;
    
        SearchRequest searchRequest = new SearchRequest(TableName, IndexName, searchQuery);
    
        SearchResponse searchResponse = otsClient.Search(searchRequest);
    
        Console.WriteLine(JsonConvert.SerializeObject(searchResponse));
    }

Agrupamento por intervalo

Agrupa os resultados da consulta com base em intervalos de valores de um campo. Valores dentro de um intervalo específico formam um grupo. O sistema retorna a quantidade de valores em cada intervalo.

  • Parâmetros

    Parâmetro

    Descrição

    GroupByName

    Nome exclusivo da operação de agregação. Use este nome para consultar os resultados de uma agregação específica.

    FieldName

    Nome do campo usado na operação de agregação. Apenas os tipos LONG e DOUBLE são suportados.

    Range[double_from, double_to)

    Intervalos de valores para agrupamento.

    O intervalo pode começar em double.MinValue e terminar em double.MaxValue.

    SubAggregation e SubGroupBy

    Operação de subagregação executada com base nos resultados do agrupamento.

    Por exemplo, após agrupar resultados por volume de vendas e por província, obtenha a província com maior participação nas vendas dentro de um intervalo específico. Para isso, defina um valor para GroupByField dentro de GroupByRange.

  • Exemplo

    /// <summary>
    /// Query by range. 
    /// </summary>
    /// <param name="otsClient"></param>
    public static void GroupByRange(OTSClient otsClient)
    {
        GroupByRange groupByRange = new GroupByRange();
        groupByRange.GroupByName = "GroupBy_Range";
        groupByRange.FieldName = "pk1";
        groupByRange.Ranges = new List<Range>
        {
            new Range(double.MinValue, 5.0),
            new Range(5.0, 50.0),
            new Range(50.0, 100.0),
            new Range(100.0, double.MaxValue)
        };
    
        MatchAllQuery matchAllQuery = new MatchAllQuery();
    
        SearchQuery searchQuery = new SearchQuery();
        searchQuery.GroupByList = new List<IGroupBy> { groupByRange };
        searchQuery.Query = matchAllQuery;
        searchQuery.Limit = 0;
    
        SearchRequest searchRequest = new SearchRequest(TableName, IndexName, searchQuery);
    
        SearchResponse searchResponse = otsClient.Search(searchRequest);
    
        Console.WriteLine(JsonConvert.SerializeObject(searchResponse));
    }

Agrupamento por localização geográfica

Agrupa os resultados da consulta com base na distância entre locais geográficos e um ponto central. Resultados dentro de faixas de distância específicas formam grupos. O sistema retorna a quantidade de valores em cada faixa.

  • Parâmetros

    Parâmetro

    Descrição

    GroupByName

    Nome exclusivo da operação de agregação. Use este nome para consultar os resultados de uma agregação específica.

    FieldName

    Nome do campo usado na operação de agregação. Apenas o tipo GEOPOINT é suportado.

    Origin(double latitude, double longitude)

    Longitude e latitude do ponto central.

    latitude define a latitude do ponto central. longitude define a longitude do ponto central.

    Range[double_from, double_to)

    Faixas de distância usadas para agrupamento. Unidade: metros.

    O intervalo pode começar em double.MinValue e terminar em double.MaxValue.

    SubAggregation e SubGroupBy

    Operação de subagregação executada com base nos resultados do agrupamento.

  • Exemplo

    /// <summary>
    /// Group by geographical location. 
    /// </summary>
    /// <param name="otsClient"></param>
    public static void GroupByGeoDistance(OTSClient otsClient)
    {
        GroupByGeoDistance groupByGeoDistance = new GroupByGeoDistance
        {
            GroupByName = "GroupBy_GeoDistance",
            FieldName = "geo_col",
            Origin = new GeoPoint(0, 0),
            Ranges = new List<Range>
            {
                new Range(double.MinValue , 1000.0),
                new Range(1000.0, 5000.0),
                new Range(5000.0, double.MaxValue)
            }
        };
    
        MatchAllQuery matchAllQuery = new MatchAllQuery();
    
        SearchQuery searchQuery = new SearchQuery();
        searchQuery.GroupByList = new List<IGroupBy> { groupByGeoDistance };
        searchQuery.Query = matchAllQuery;
        searchQuery.Limit = 0;
    
        SearchRequest searchRequest = new SearchRequest(TableName, IndexName, searchQuery);
    
        SearchResponse searchResponse = otsClient.Search(searchRequest);
    
        Console.WriteLine(JsonConvert.SerializeObject(searchResponse));
    }

Agrupamento por filtro

Filtra os resultados da consulta e os agrupa para obter a quantidade de correspondências de cada filtro. Os resultados seguem a ordem de definição dos filtros.

  • Parâmetros

    Parâmetro

    Descrição

    GroupByName

    Nome exclusivo da operação de agregação. Use este nome para consultar os resultados de uma agregação específica.

    Filters

    Filtros aplicáveis à consulta. Os resultados seguem a ordem de definição dos filtros.

    SubAggregation e SubGroupBy

    Operação de subagregação executada com base nos resultados do agrupamento.

  • Exemplo

    /// <summary>
    /// Group by filter. 
    /// </summary>
    /// <param name="otsClient"></param>
    public static void GroupByFilter(OTSClient otsClient)
    {
        GroupByFilter groupByFilter = new GroupByFilter
        {
            GroupByName = "GroupBy_Filter",
            Filters = new List<IQuery>
            {
                new RangeQuery
                {
                    FieldName = "pk1",
                    From = new ColumnValue(0.0),
                    To = new ColumnValue(5.0)
                },
            }
        };
    
        TermsQuery termsQuery = new TermsQuery();
        termsQuery.FieldName = "pk0";
        termsQuery.Terms = new List<ColumnValue>
        {
            new ColumnValue("Tablestore SearchIndex"),
            new ColumnValue("SearchIndex")
        };
    
        SearchQuery searchQuery = new SearchQuery();
        searchQuery.GroupByList = new List<IGroupBy> { groupByFilter };
        searchQuery.Query = termsQuery;
        searchQuery.Limit = 0;
    
        SearchRequest searchRequest = new SearchRequest(TableName, IndexName, searchQuery);
    
        SearchResponse searchResponse = otsClient.Search(searchRequest);
    
        Console.WriteLine(JsonConvert.SerializeObject(searchResponse));
    }

Consulta por histograma

Agrupa os resultados da consulta com base em intervalos de dados específicos. Valores de campo dentro do mesmo intervalo formam um grupo. O sistema retorna o intervalo de valores e a quantidade de itens de cada grupo.

  • Parâmetros

    Parâmetro

    Descrição

    GroupByName

    Nome exclusivo da operação de agregação. Use este nome para consultar os resultados de uma agregação específica.

    FieldName

    Nome do campo usado na operação de agregação. Apenas os tipos LONG e DOUBLE são suportados.

    Interval

    Intervalo de dados utilizado para gerar os resultados da agregação.

    FieldRange[min,max]

    Intervalo usado em conjunto com o parâmetro interval para limitar a quantidade de grupos. O resultado da fórmula (FieldRange.max-FieldRange.min)/interval não pode ultrapassar 2.000.

    MinDocCount

    Número mínimo de linhas. Se um grupo tiver menos linhas que esse mínimo, seus resultados de agregação não serão retornados.

    Missing

    Valor padrão assumido pelo campo quando uma linha possui valor vazio durante a agregação.

    • Se nenhum valor for definido para Missing, a linha será ignorada.

    • Se um valor for definido para Missing, o sistema usará esse parâmetro como valor do campo na linha.

  • Exemplo

    /// <summary>
    /// Query by histogram. 
    /// </summary>
    /// <param name="otsClient"></param>
    public static void HistogramAggregation(OTSClient otsClient)
    {
        GroupByHistogram groupByHistogram = new GroupByHistogram();
        groupByHistogram.GroupByName = "GroupBy_Histogram";
        groupByHistogram.FieldName = "pk1";
        groupByHistogram.Interval = new ColumnValue(5);
        groupByHistogram.Missing = new ColumnValue(100);
        groupByHistogram.FieldRange = new FieldRange(new ColumnValue(0), new ColumnValue(1000));
    
        MatchAllQuery matchAllQuery = new MatchAllQuery(); ;
    
        SearchQuery searchQuery = new SearchQuery();
        searchQuery.Query = matchAllQuery;
        searchQuery.Limit = 0;
        searchQuery.GroupByList = new List<IGroupBy>
        {
            groupByHistogram
        };
    
        SearchRequest searchRequest = new SearchRequest(TableName, IndexName, searchQuery);
    
        SearchResponse searchResponse = otsClient.Search(searchRequest);
    
        foreach (GroupByHistogramResultItem item in searchResponse.GroupByResults.GetAsGroupByHistogramResult("GroupBy_Histogram").GroupByHistogramResultItems)
        {
            Console.WriteLine(JsonConvert.SerializeObject(item));
        }
    }

Consulta das linhas obtidas dos resultados de agregação em cada grupo

Após agrupar os resultados da consulta, consulte as linhas de cada grupo. Este método funciona de maneira semelhante à função ANY_VALUE(campo) do MySQL.

Nota

Ao consultar as linhas obtidas dos resultados de agregação em cada grupo, os resultados retornarão apenas informações da chave primária se o índice de pesquisa contiver campos Nested, Geopoint ou Array. Para obter o campo desejado, consulte diretamente a tabela de dados.

  • Parâmetros

    Parâmetro

    Descrição

    AggName

    Nome exclusivo da operação de agregação. Use este nome para consultar os resultados de uma agregação específica.

    Limit

    Número máximo de linhas retornadas por grupo. Por padrão, apenas uma linha de dados é retornada.

    Sort

    Método de ordenação dos dados dentro dos grupos.

    ColumnsToGet

    Campos a serem retornados. Apenas campos presentes em índices de pesquisa são suportados. Campos ARRAY, DATE, GEOPOINT e NESTED não são aceitos.

    O valor deste parâmetro corresponde ao valor de columnsToGet em SearchRequest. Basta especificar columnsToGet em SearchRequest.

  • Exemplo

    /// <summary>
    /// Query the rows that are obtained from the results of an aggregation operation in each group. 
    /// </summary>
    /// <param name="otsClient"></param>
    public static void TopRowsAggregation(OTSClient otsClient)
    {
        GroupByField groupByField = new GroupByField();
        groupByField.GroupByName = "GroupBy_Field";
        groupByField.FieldName = "pk0";
        groupByField.SubAggregations = new List<IAggregation>
        {
            new TopRowsAggregation
            {
                AggName = "TopRows_Agg",
                Sort = new Sort(new List<ISorter> { new FieldSort("pk1", SortOrder.DESC) }),
                Limit = 2
            }
        };
    
        MatchAllQuery matchAllQuery = new MatchAllQuery(); ;
    
        SearchQuery searchQuery = new SearchQuery();
        searchQuery.Query = matchAllQuery;
        searchQuery.Limit = 0;
        searchQuery.GroupByList = new List<IGroupBy>
        {
            groupByField
        };
    
        SearchRequest searchRequest = new SearchRequest(TableName, IndexName, searchQuery);
    
        SearchResponse searchResponse = otsClient.Search(searchRequest);
    
        foreach (GroupByFieldResultItem item in searchResponse.GroupByResults.GetAsGroupByFieldResult("GroupBy_Field").GroupByFieldResultItems)
        {
            foreach (Row row in item.SubAggregationResults.GetAsTopRowsAggregationResult("TopRows_Agg").Rows)
            {
                Console.WriteLine(JsonConvert.SerializeObject(row));
            }
        }
    }

Aninhamento

O aninhamento permite executar subagregações dentro de um grupo. Por exemplo, é possível realizar operações de agregação aninhadas em até dois níveis.

  • GroupBy + SubGroupBy: Agrupa itens por província e por cidade para obter dados de cada cidade dentro de cada província.

  • GroupBy + SubAggregation: Agrupa itens por província e calcula o valor máximo de uma métrica para obter o valor máximo dessa métrica por província.

Nota

Para equilibrar desempenho e complexidade, o sistema limita o número de camadas de aninhamento. Para mais informações, consulte Limites do índice de pesquisa.

/// <summary>
/// Nesting. 
/// </summary>
/// <param name="otsClient"></param>
public static void SubGroupBy(OTSClient otsClient)
{
    GroupByField groupByField = new GroupByField();
    groupByField.GroupByName = "Field_GroupBy";
    groupByField.FieldName = "pk0";
    groupByField.SubGroupBys = new List<IGroupBy>
    {
        new GroupByRange
        {
            GroupByName = "Range_GroupBy",
            FieldName = "pk1",
            Ranges = new List<Range>
            {
                new Range(double.MinValue, 5),
                new Range(5,100),
                new Range(100, double.MaxValue)
            }

        }
    };

    MatchAllQuery matchAllQuery = new MatchAllQuery();

    SearchQuery searchQuery = new SearchQuery();
    searchQuery.GroupByList = new List<IGroupBy>
    {
        groupByField
    };
    searchQuery.GetTotalCount = true;
    searchQuery.Limit = 0;
    searchQuery.Query = matchAllQuery;

    SearchRequest searchRequest = new SearchRequest(TableName, IndexName, searchQuery);

    SearchResponse searchResponse = otsClient.Search(searchRequest);

    foreach (GroupByFieldResultItem item in searchResponse.GroupByResults.GetAsGroupByFieldResult("Field_GroupBy").GroupByFieldResultItems)
    {
        Console.WriteLine(JsonConvert.SerializeObject(item.SubGroupByResults.GetAsGroupByRangeResult("Range_GroupBy")));
    }
}

Múltiplas agregações

Execute várias operações de agregação simultaneamente.

Nota

A execução simultânea de múltiplas agregações complexas pode demandar muito tempo de processamento.

/// <summary>
/// Multiple aggregations. 
/// </summary>
/// <param name="otsClient"></param>
public static void MultipleAggregation(OTSClient otsClient)
{
    MaxAggregation maxAggregation = new MaxAggregation();
    maxAggregation.AggName = "Max_Agg";
    maxAggregation.FieldName = "pk1";

    MinAggregation minAggregation = new MinAggregation();
    minAggregation.AggName = "Min_Agg";
    minAggregation.FieldName = "pk1";

    SumAggregation sumAggregation = new SumAggregation();
    sumAggregation.AggName = "Sum_Agg";
    sumAggregation.FieldName = "pk1";

    SearchQuery searchQuery = new SearchQuery();
    searchQuery.Limit = 0;
    searchQuery.Query = new MatchAllQuery();
    searchQuery.AggregationList = new List<IAggregation>
    {
        maxAggregation,
        minAggregation,
        sumAggregation
    };

    SearchRequest searchRequest = new SearchRequest(TableName, IndexName, searchQuery);

    SearchResponse searchResponse = otsClient.Search(searchRequest);

    Console.WriteLine(JsonConvert.SerializeObject(searchResponse));
}