Spec-Zone.ru › Elasticsearch 7
›Elasticsearch Guide [7.17] ›Агрегирования ›Агрегирования метрик

Агрегирование Rate

Агрегирование метрик rate может быть использовано только внутри агрегации date_histogram или composite. Оно вычисляет скорость документов или поля в каждом бакете. Значения полей могут быть извлечены из конкретных числовых или полей гистограммы в документах.

Для агрегаций composite должно быть ровно одно date_histogram источник для поддержки агрегации rate.

Синтаксис

Агрегирование rate выглядит следующим образом изолированно:

{
  "rate": {
    "unit": "month",
    "field": "requests"
  }
}

Следующий запрос сгруппирует все записи продаж по месяцам и затем преобразует количество транзакций продаж в каждом бакете в годовой показатель продаж.

GET sales/_search
{
  "size": 0,
  "aggs": {
    "by_date": {
      "date_histogram": {
        "field": "date",
        "calendar_interval": "month"  
      },
      "aggs": {
        "my_rate": {
          "rate": {
            "unit": "year"  
          }
        }
      }
    }
  }
}

Гистограмма сгруппирована по месяцам.

Но показатель преобразуется в годовой.

Ответ вернёт годовой показатель транзакций в каждом бакете. Поскольку в году 12 месяцев, годовой показатель будет автоматически рассчитан путём умножения месячного показателя на 12.

{
  ...
  "aggregations" : {
    "by_date" : {
      "buckets" : [
        {
          "key_as_string" : "2015/01/01 00:00:00",
          "key" : 1420070400000,
          "doc_count" : 3,
          "my_rate" : {
            "value" : 36.0
          }
        },
        {
          "key_as_string" : "2015/02/01 00:00:00",
          "key" : 1422748800000,
          "doc_count" : 2,
          "my_rate" : {
            "value" : 24.0
          }
        },
        {
          "key_as_string" : "2015/03/01 00:00:00",
          "key" : 1425168000000,
          "doc_count" : 2,
          "my_rate" : {
            "value" : 24.0
          }
        }
      ]
    }
  }
}

Вместо подсчёта количества документов, также можно вычислить сумму всех значений полей в документах в каждом бакете или количество значений в каждом бакете. Следующий запрос сгруппирует все записи продаж по месячным бакетам и затем рассчитает общие месячные продажи и преобразует их в среднедневные продажи.

GET sales/_search
{
  "size": 0,
  "aggs": {
    "by_date": {
      "date_histogram": {
        "field": "date",
        "calendar_interval": "month"  
      },
      "aggs": {
        "avg_price": {
          "rate": {
            "field": "price", 
            "unit": "day"  
          }
        }
      }
    }
  }
}

Гистограмма сгруппирована по месяцам.

Рассчитать сумму всех цен продаж

Преобразовать в среднедневные продажи

Ответ будет содержать средние ежедневные цены продаж для каждого месяца.

{
  ...
  "aggregations" : {
    "by_date" : {
      "buckets" : [
        {
          "key_as_string" : "2015/01/01 00:00:00",
          "key" : 1420070400000,
          "doc_count" : 3,
          "avg_price" : {
            "value" : 17.741935483870968
          }
        },
        {
          "key_as_string" : "2015/02/01 00:00:00",
          "key" : 1422748800000,
          "doc_count" : 2,
          "avg_price" : {
            "value" : 2.142857142857143
          }
        },
        {
          "key_as_string" : "2015/03/01 00:00:00",
          "key" : 1425168000000,
          "doc_count" : 2,
          "avg_price" : {
            "value" : 12.096774193548388
          }
        }
      ]
    }
  }
}

Вы также можете воспользоваться агрегациями composite для расчёта средней ежедневной цены продажи для каждого товара на вашем складе.

GET sales/_search?filter_path=aggregations&size=0
{
  "aggs": {
    "buckets": {
      "composite": { 
        "sources": [
          {
            "month": {
              "date_histogram": { 
                "field": "date",
                "calendar_interval": "month"
              }
            }
          },
          {
            "type": { 
              "terms": {
                "field": "type"
              }
            }
          }
        ]
      },
      "aggs": {
        "avg_price": {
          "rate": {
            "field": "price", 
            "unit": "day" 
          }
        }
      }
    }
  }
}

Составная агрегация с источником гистограммы дат и источником для типа товара.

Источник гистограммы дат группирует по месяцам

Источник terms группирует для каждого типа товара продажи

Рассчитать сумму всех цен продаж на каждый месяц и товар

Преобразовать в средние ежедневные продажи на каждый товар

Ответ будет содержать средние ежедневные цены продаж для каждого месяца по каждому товару.

{
  "aggregations" : {
    "buckets" : {
      "after_key" : {
        "month" : 1425168000000,
        "type" : "t-shirt"
      },
      "buckets" : [
        {
          "key" : {
            "month" : 1420070400000,
            "type" : "bag"
          },
          "doc_count" : 1,
          "avg_price" : {
            "value" : 4.838709677419355
          }
        },
        {
          "key" : {
            "month" : 1420070400000,
            "type" : "hat"
          },
          "doc_count" : 1,
          "avg_price" : {
            "value" : 6.451612903225806
          }
        },
        {
          "key" : {
            "month" : 1420070400000,
            "type" : "t-shirt"
          },
          "doc_count" : 1,
          "avg_price" : {
            "value" : 6.451612903225806
          }
        },
        {
          "key" : {
            "month" : 1422748800000,
            "type" : "hat"
          },
          "doc_count" : 1,
          "avg_price" : {
            "value" : 1.7857142857142858
          }
        },
        {
          "key" : {
            "month" : 1422748800000,
            "type" : "t-shirt"
          },
          "doc_count" : 1,
          "avg_price" : {
            "value" : 0.35714285714285715
          }
        },
        {
          "key" : {
            "month" : 1425168000000,
            "type" : "hat"
          },
          "doc_count" : 1,
          "avg_price" : {
            "value" : 6.451612903225806
          }
        },
        {
          "key" : {
            "month" : 1425168000000,
            "type" : "t-shirt"
          },
          "doc_count" : 1,
          "avg_price" : {
            "value" : 5.645161290322581
          }
        }
      ]
    }
  }
}

Добавив параметр mode со значением value_count, можно изменить вычисление с sum на количество значений поля:

GET sales/_search
{
  "size": 0,
  "aggs": {
    "by_date": {
      "date_histogram": {
        "field": "date",
        "calendar_interval": "month"  
      },
      "aggs": {
        "avg_number_of_sales_per_year": {
          "rate": {
            "field": "price", 
            "unit": "year",  
            "mode": "value_count" 
          }
        }
      }
    }
  }
}

Гистограмма сгруппирована по месяцам.

Рассчитать количество всех цен продаж

Преобразовать в годовой счёт

Изменение режима на подсчёт значений

Ответ будет содержать среднюю ежедневную цену продаж для каждого месяца.

{
  ...
  "aggregations" : {
    "by_date" : {
      "buckets" : [
        {
          "key_as_string" : "2015/01/01 00:00:00",
          "key" : 1420070400000,
          "doc_count" : 3,
          "avg_number_of_sales_per_year" : {
            "value" : 36.0
          }
        },
        {
          "key_as_string" : "2015/02/01 00:00:00",
          "key" : 1422748800000,
          "doc_count" : 2,
          "avg_number_of_sales_per_year" : {
            "value" : 24.0
          }
        },
        {
          "key_as_string" : "2015/03/01 00:00:00",
          "key" : 1425168000000,
          "doc_count" : 2,
          "avg_number_of_sales_per_year" : {
            "value" : 24.0
          }
        }
      ]
    }
  }
}

По умолчанию используется режим sum.

"mode": "sum"
вычислить сумму всех значений поля
"mode": "value_count"
использовать количество значений в поле

Взаимосвязь между размерами бакетов и скоростью

Агрегация rate поддерживает все скорости, которые могут быть использованы в параметре calendar_intervals агрегации date_histogram. Указанная скорость должна быть совместима с интервалом агрегации date_histogram, т. е. должно быть возможно преобразовать размер бакета в скорость. По умолчанию используется интервал агрегации date_histogram.

"rate": "second"
совместим со всеми интервалами
"rate": "minute"
совместим со всеми интервалами
"rate": "hour"
совместим со всеми интервалами
"rate": "day"
совместим со всеми интервалами
"rate": "week"
совместим со всеми интервалами
"rate": "month"
совместим только с интервалами month, quarter и year
"rate": "quarter"
совместим только с интервалами month, quarter и year
"rate": "year"
совместим только с интервалами month, quarter и year

Также существует дополнительное ограничение, если гистограмма дат не является непосредственным родителем гистограммы скоростей. В этом случае интервал скоростей и интервал гистограммы должны находиться в одной группе: [second, `минута`, hour, day, week] или [month, quarter, year]. Например, если гистограмма дат основана на month, поддерживаются только интервалы скоростей month, quarter или year. Если гистограмма дат основана на day, поддерживаются только интервалы скоростей second, `минута`, hour, day и week.

Скрипт

Если вам нужно выполнить агрегацию по значениям, которые не индексированы, выполните агрегацию по runtime полю. Например, если нам нужно скорректировать наши цены перед расчётом скоростей:

GET sales/_search
{
  "size": 0,
  "runtime_mappings": {
    "price.adjusted": {
      "type": "double",
      "script": {
        "source": "emit(doc['price'].value * params.adjustment)",
        "params": {
          "adjustment": 0.9
        }
      }
    }
  },
  "aggs": {
    "by_date": {
      "date_histogram": {
        "field": "date",
        "calendar_interval": "month"
      },
      "aggs": {
        "avg_price": {
          "rate": {
            "field": "price.adjusted"
          }
        }
      }
    }
  }
}
{
  ...
  "aggregations" : {
    "by_date" : {
      "buckets" : [
        {
          "key_as_string" : "2015/01/01 00:00:00",
          "key" : 1420070400000,
          "doc_count" : 3,
          "avg_price" : {
            "value" : 495.0
          }
        },
        {
          "key_as_string" : "2015/02/01 00:00:00",
          "key" : 1422748800000,
          "doc_count" : 2,
          "avg_price" : {
            "value" : 54.0
          }
        },
        {
          "key_as_string" : "2015/03/01 00:00:00",
          "key" : 1425168000000,
          "doc_count" : 2,
          "avg_price" : {
            "value" : 337.5
          }
        }
      ]
    }
  }
}

© 2023-2025 Elasticsearch
As of September 2024, Elasticsearch is available under a choice of three licenses: the Server Side Public License (SSPL), the Elastic License, or the AGPLv3 (OSI approved).
Elasticsearch and the Elasticsearch logo are trademarks of Elasticsearch B.V., registered in the U.S. and in other countries.
https://www.elastic.co/guide/en/elasticsearch/reference/7.17/search-aggregations-metrics-rate-aggregation.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API