Агрегация взвешенного среднего
Метрическая агрегация single-value, которая вычисляет взвешенное среднее значение числовых значений, извлечённых из агрегированных документов. Эти значения могут быть извлечены как из конкретных числовых полей в документах.
При вычислении обычного среднего значения каждый элемент данных имеет равный «вес» … он в равной мере влияет на итоговое значение. Взвешенные средние, с другой стороны, придают разный вес каждому элементу данных. Степень влияния каждого элемента данных на итоговое значение извлекается из документа.
Формула для вычисления взвешенного среднего значения: ∑(value * weight) / ∑(weight)
Обычное среднее можно рассматривать как взвешенное среднее, где каждое значение имеет неявный вес 1.
Таблица 46. weighted_avg Параметры
| Имя параметра | Описание | Обязательно | Значение по умолчанию |
|---|---|---|---|
| Настройка поля или скрипта, предоставляющего значения | Обязательно | |
| Настройка поля или скрипта, предоставляющего веса | Обязательно | |
| Формат представления числового ответа | Необязательно |
Объекты value и weight имеют конфигурацию, специфичную для каждого поля:
Таблица 47. value Параметры
| Имя параметра | Описание | Обязательно | Значение по умолчанию |
|---|---|---|---|
| Поле, из которого должны быть извлечены значения | Обязательно | |
| Значение, используемое, если поле отсутствует | Необязательно |
Таблица 48. weight Параметры
| Имя параметра | Описание | Обязательно | Значение по умолчанию |
|---|---|---|---|
| Поле, из которого должны быть извлечены веса | Обязательно | |
| Вес, используемый, если поле отсутствует | Необязательно |
Примеры
Если в наших документах есть поле "grade", содержащее числовой балл от 0 до 100, и поле "weight", содержащее произвольный числовой вес, мы можем вычислить взвешенное среднее значение, используя:
POST /exams/_search
{
"size": 0,
"aggs": {
"weighted_grade": {
"weighted_avg": {
"value": {
"field": "grade"
},
"weight": {
"field": "weight"
}
}
}
}
} Что даёт ответ вида:
{
...
"aggregations": {
"weighted_grade": {
"value": 70.0
}
}
} Хотя несколько значений на поле допускаются, разрешён только один вес. Если агрегация обнаруживает документ, содержащий более одного веса (например, поле веса является многозначным полем), поиск будет прерван. В этой ситуации необходимо создать поле вычисления, чтобы объединить эти значения в один вес.
Этот единственный вес будет независимо применяться к каждому значению, извлеченному из поля value.
Этот пример демонстрирует, как один документ с несколькими значениями будет усреднён с одним весом:
POST /exams/_doc?refresh
{
"grade": [1, 2, 3],
"weight": 2
}
POST /exams/_search
{
"size": 0,
"aggs": {
"weighted_grade": {
"weighted_avg": {
"value": {
"field": "grade"
},
"weight": {
"field": "weight"
}
}
}
}
} Три значения (1, 2 и 3) будут включены как независимые значения, все с весом 2:
{
...
"aggregations": {
"weighted_grade": {
"value": 2.0
}
}
} Агрегация возвращает 2.0 как результат, что соответствует ожидаемому результату при ручном вычислении: ((1*2) + (2*2) + (3*2)) / (2+2+2) == 2
Поле вычисления
Если вам нужно суммировать или взвешивать значения, которые не совсем соответствуют индексированным значениям, используйте агрегацию на поле вычисления.
POST /exams/_doc?refresh
{
"grade": 100,
"weight": [2, 3]
}
POST /exams/_doc?refresh
{
"grade": 80,
"weight": 3
}
POST /exams/_search?filter_path=aggregations
{
"size": 0,
"runtime_mappings": {
"weight.combined": {
"type": "double",
"script": """
double s = 0;
for (double w : doc['weight']) {
s += w;
}
emit(s);
"""
}
},
"aggs": {
"weighted_grade": {
"weighted_avg": {
"value": {
"script": "doc.grade.value + 1"
},
"weight": {
"field": "weight.combined"
}
}
}
}
} Что должно выглядеть примерно так:
{
"aggregations": {
"weighted_grade": {
"value": 93.5
}
}
} Пропущенные значения
По умолчанию, агрегация исключает документы с пропущенным или null значением для поля value или weight. Используйте параметр missing, чтобы вместо этого указать значение по умолчанию для этих документов.
POST /exams/_search
{
"size": 0,
"aggs": {
"weighted_grade": {
"weighted_avg": {
"value": {
"field": "grade",
"missing": 2
},
"weight": {
"field": "weight",
"missing": 3
}
}
}
}
}
© 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-weight-avg-aggregation.html