Spec-Zone.ru › Elasticsearch 7
›Elasticsearch Guide [7.17] ›Агрегации ›Метрические агрегации

Агрегация взвешенного среднего

Метрическая агрегация single-value, которая вычисляет взвешенное среднее значение числовых значений, извлечённых из агрегированных документов. Эти значения могут быть извлечены как из конкретных числовых полей в документах.

При вычислении обычного среднего значения каждый элемент данных имеет равный «вес» … он в равной мере влияет на итоговое значение. Взвешенные средние, с другой стороны, придают разный вес каждому элементу данных. Степень влияния каждого элемента данных на итоговое значение извлекается из документа.

Формула для вычисления взвешенного среднего значения: ∑(value * weight) / ∑(weight)

Обычное среднее можно рассматривать как взвешенное среднее, где каждое значение имеет неявный вес 1.

Таблица 46. weighted_avg Параметры

Имя параметра Описание Обязательно Значение по умолчанию

value

Настройка поля или скрипта, предоставляющего значения

Обязательно

weight

Настройка поля или скрипта, предоставляющего веса

Обязательно

format

Формат представления числового ответа

Необязательно

Объекты value и weight имеют конфигурацию, специфичную для каждого поля:

Таблица 47. value Параметры

Имя параметра Описание Обязательно Значение по умолчанию

field

Поле, из которого должны быть извлечены значения

Обязательно

missing

Значение, используемое, если поле отсутствует

Необязательно

Таблица 48. weight Параметры

Имя параметра Описание Обязательно Значение по умолчанию

field

Поле, из которого должны быть извлечены веса

Обязательно

missing

Вес, используемый, если поле отсутствует

Необязательно

Примеры

Если в наших документах есть поле "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

Spec-Zone.ru

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