Агрегирование Stats
multi-value метрическое агрегирование, которое вычисляет статистические данные по числовым значениям, извлечённым из агрегированных документов.
Возвращаемые статистические данные включают: min, max, sum, count и avg.
Предполагая, что данные состоят из документов, представляющих оценки экзаменов (от 0 до 100) студентов
resp = client.search(
index="exams",
size="0",
aggs={
"grades_stats": {
"stats": {
"field": "grade"
}
}
},
)
print(resp) response = client.search(
index: 'exams',
size: 0,
body: {
aggregations: {
grades_stats: {
stats: {
field: 'grade'
}
}
}
}
)
puts response const response = await client.search({
index: "exams",
size: 0,
aggs: {
grades_stats: {
stats: {
field: "grade",
},
},
},
});
console.log(response); POST /exams/_search?size=0
{
"aggs": {
"grades_stats": { "stats": { "field": "grade" } }
}
} Вышеупомянутое агрегирование вычисляет статистику оценок по всем документам. Тип агрегирования — stats, а настройка field определяет числовое поле документов, по которому будут вычисляться статистические данные. Вышеприведённое вернёт следующее:
{
...
"aggregations": {
"grades_stats": {
"count": 2,
"min": 50.0,
"max": 100.0,
"avg": 75.0,
"sum": 150.0
}
}
} Имя агрегации (grades_stats выше) также используется в качестве ключа, по которому можно получить результат агрегирования из возвращённого ответа.
Скрипт
Если вам нужно получить stats для чего-то более сложного, чем одно поле, выполните агрегирование по полю runtime.
resp = client.search(
index="exams",
size=0,
runtime_mappings={
"grade.weighted": {
"type": "double",
"script": "\n emit(doc['grade'].value * doc['weight'].value)\n "
}
},
aggs={
"grades_stats": {
"stats": {
"field": "grade.weighted"
}
}
},
)
print(resp) response = client.search(
index: 'exams',
body: {
size: 0,
runtime_mappings: {
'grade.weighted' => {
type: 'double',
script: "\n emit(doc['grade'].value * doc['weight'].value)\n "
}
},
aggregations: {
grades_stats: {
stats: {
field: 'grade.weighted'
}
}
}
}
)
puts response const response = await client.search({
index: "exams",
size: 0,
runtime_mappings: {
"grade.weighted": {
type: "double",
script:
"\n emit(doc['grade'].value * doc['weight'].value)\n ",
},
},
aggs: {
grades_stats: {
stats: {
field: "grade.weighted",
},
},
},
});
console.log(response); POST /exams/_search
{
"size": 0,
"runtime_mappings": {
"grade.weighted": {
"type": "double",
"script": """
emit(doc['grade'].value * doc['weight'].value)
"""
}
},
"aggs": {
"grades_stats": {
"stats": {
"field": "grade.weighted"
}
}
}
} Пропущенные значения
Параметр missing определяет, как должны обрабатываться документы, у которых отсутствует значение. По умолчанию они будут игнорироваться, но также можно обрабатывать их так, как будто у них есть значение.
resp = client.search(
index="exams",
size="0",
aggs={
"grades_stats": {
"stats": {
"field": "grade",
"missing": 0
}
}
},
)
print(resp) response = client.search(
index: 'exams',
size: 0,
body: {
aggregations: {
grades_stats: {
stats: {
field: 'grade',
missing: 0
}
}
}
}
)
puts response const response = await client.search({
index: "exams",
size: 0,
aggs: {
grades_stats: {
stats: {
field: "grade",
missing: 0,
},
},
},
});
console.log(response); POST /exams/_search?size=0
{
"aggs": {
"grades_stats": {
"stats": {
"field": "grade",
"missing": 0
}
}
}
} | Документы без значения в поле |
© 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-stats-aggregation.html