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

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

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

Предположим, что данные состоят из документов, представляющих оценки за экзамен (от 0 до 100) студентов. Мы можем вычислить средний балл:

resp = client.search(
    index="exams",
    size="0",
    aggs={
        "avg_grade": {
            "avg": {
                "field": "grade"
            }
        }
    },
)
print(resp)
response = client.search(
  index: 'exams',
  size: 0,
  body: {
    aggregations: {
      avg_grade: {
        avg: {
          field: 'grade'
        }
      }
    }
  }
)
puts response
const response = await client.search({
  index: "exams",
  size: 0,
  aggs: {
    avg_grade: {
      avg: {
        field: "grade",
      },
    },
  },
});
console.log(response);
POST /exams/_search?size=0
{
  "aggs": {
    "avg_grade": { "avg": { "field": "grade" } }
  }
}

Это агрегирование вычисляет среднюю оценку по всем документам. Тип агрегирования — avg, и настройка field определяет числовое поле документов, по которому будет вычислено среднее значение. Результат будет следующим:

{
  ...
  "aggregations": {
    "avg_grade": {
      "value": 75.0
    }
  }
}

Имя агрегирования (avg_grade выше) также служит ключом, по которому результат агрегирования можно получить из возвращённого ответа.

Сценарии

Предположим, что экзамен был чрезвычайно сложным, и вам нужно внести коррективы в оценки. Вычислим среднее значение для динамического поля, чтобы получить скорректированное среднее значение:

resp = client.search(
    index="exams",
    size="0",
    runtime_mappings={
        "grade.corrected": {
            "type": "double",
            "script": {
                "source": "emit(Math.min(100, doc['grade'].value * params.correction))",
                "params": {
                    "correction": 1.2
                }
            }
        }
    },
    aggs={
        "avg_corrected_grade": {
            "avg": {
                "field": "grade.corrected"
            }
        }
    },
)
print(resp)
response = client.search(
  index: 'exams',
  size: 0,
  body: {
    runtime_mappings: {
      'grade.corrected' => {
        type: 'double',
        script: {
          source: "emit(Math.min(100, doc['grade'].value * params.correction))",
          params: {
            correction: 1.2
          }
        }
      }
    },
    aggregations: {
      avg_corrected_grade: {
        avg: {
          field: 'grade.corrected'
        }
      }
    }
  }
)
puts response
const response = await client.search({
  index: "exams",
  size: 0,
  runtime_mappings: {
    "grade.corrected": {
      type: "double",
      script: {
        source: "emit(Math.min(100, doc['grade'].value * params.correction))",
        params: {
          correction: 1.2,
        },
      },
    },
  },
  aggs: {
    avg_corrected_grade: {
      avg: {
        field: "grade.corrected",
      },
    },
  },
});
console.log(response);
POST /exams/_search?size=0
{
  "runtime_mappings": {
    "grade.corrected": {
      "type": "double",
      "script": {
        "source": "emit(Math.min(100, doc['grade'].value * params.correction))",
        "params": {
          "correction": 1.2
        }
      }
    }
  },
  "aggs": {
    "avg_corrected_grade": {
      "avg": {
        "field": "grade.corrected"
      }
    }
  }
}

Пропущенное значение

Параметр missing определяет, как должны обрабатываться документы, в которых отсутствует значение. По умолчанию они игнорируются, но также можно обработать их так, как будто у них есть значение.

resp = client.search(
    index="exams",
    size="0",
    aggs={
        "grade_avg": {
            "avg": {
                "field": "grade",
                "missing": 10
            }
        }
    },
)
print(resp)
response = client.search(
  index: 'exams',
  size: 0,
  body: {
    aggregations: {
      grade_avg: {
        avg: {
          field: 'grade',
          missing: 10
        }
      }
    }
  }
)
puts response
const response = await client.search({
  index: "exams",
  size: 0,
  aggs: {
    grade_avg: {
      avg: {
        field: "grade",
        missing: 10,
      },
    },
  },
});
console.log(response);
POST /exams/_search?size=0
{
  "aggs": {
    "grade_avg": {
      "avg": {
        "field": "grade",
        "missing": 10     
      }
    }
  }
}

Документы без значения в поле grade попадут в ту же группу, что и документы, имеющие значение 10.

Гистограммные поля

Когда среднее значение вычисляется по гистограммным полям, результатом агрегирования является взвешенное среднее всех элементов в массиве values, учитывая число в той же позиции в массиве counts.

Например, для следующего индекса, который хранит предварительно агрегированные гистограммы с метриками задержки для разных сетей:

resp = client.index(
    index="metrics_index",
    id="1",
    document={
        "network.name": "net-1",
        "latency_histo": {
            "values": [
                0.1,
                0.2,
                0.3,
                0.4,
                0.5
            ],
            "counts": [
                3,
                7,
                23,
                12,
                6
            ]
        }
    },
)
print(resp)

resp1 = client.index(
    index="metrics_index",
    id="2",
    document={
        "network.name": "net-2",
        "latency_histo": {
            "values": [
                0.1,
                0.2,
                0.3,
                0.4,
                0.5
            ],
            "counts": [
                8,
                17,
                8,
                7,
                6
            ]
        }
    },
)
print(resp1)

resp2 = client.search(
    index="metrics_index",
    size="0",
    aggs={
        "avg_latency": {
            "avg": {
                "field": "latency_histo"
            }
        }
    },
)
print(resp2)
response = client.index(
  index: 'metrics_index',
  id: 1,
  body: {
    'network.name' => 'net-1',
    latency_histo: {
      values: [
        0.1,
        0.2,
        0.3,
        0.4,
        0.5
      ],
      counts: [
        3,
        7,
        23,
        12,
        6
      ]
    }
  }
)
puts response

response = client.index(
  index: 'metrics_index',
  id: 2,
  body: {
    'network.name' => 'net-2',
    latency_histo: {
      values: [
        0.1,
        0.2,
        0.3,
        0.4,
        0.5
      ],
      counts: [
        8,
        17,
        8,
        7,
        6
      ]
    }
  }
)
puts response

response = client.search(
  index: 'metrics_index',
  size: 0,
  body: {
    aggregations: {
      avg_latency: {
        avg: {
          field: 'latency_histo'
        }
      }
    }
  }
)
puts response
const response = await client.index({
  index: "metrics_index",
  id: 1,
  document: {
    "network.name": "net-1",
    latency_histo: {
      values: [0.1, 0.2, 0.3, 0.4, 0.5],
      counts: [3, 7, 23, 12, 6],
    },
  },
});
console.log(response);

const response1 = await client.index({
  index: "metrics_index",
  id: 2,
  document: {
    "network.name": "net-2",
    latency_histo: {
      values: [0.1, 0.2, 0.3, 0.4, 0.5],
      counts: [8, 17, 8, 7, 6],
    },
  },
});
console.log(response1);

const response2 = await client.search({
  index: "metrics_index",
  size: 0,
  aggs: {
    avg_latency: {
      avg: {
        field: "latency_histo",
      },
    },
  },
});
console.log(response2);
PUT metrics_index/_doc/1
{
  "network.name" : "net-1",
  "latency_histo" : {
      "values" : [0.1, 0.2, 0.3, 0.4, 0.5], 
      "counts" : [3, 7, 23, 12, 6] 
   }
}

PUT metrics_index/_doc/2
{
  "network.name" : "net-2",
  "latency_histo" : {
      "values" :  [0.1, 0.2, 0.3, 0.4, 0.5], 
      "counts" : [8, 17, 8, 7, 6] 
   }
}

POST /metrics_index/_search?size=0
{
  "aggs": {
    "avg_latency":
      { "avg": { "field": "latency_histo" }
    }
  }
}

Для каждого гистограммных поля агрегирование avg добавляет каждое число в массиве values <1>, умноженное на соответствующее количество в массиве counts <2>. В конечном итоге вычисляется среднее значение по этим значениям для всех гистограмм, и возвращается следующий результат:

{
  ...
  "aggregations": {
    "avg_latency": {
      "value": 0.29690721649
    }
  }
}

© 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/8.17/search-aggregations-metrics-avg-aggregation.html

Spec-Zone.ru

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