Агрегация Min
Агрегация метрик single-value, которая отслеживает и возвращает минимальное значение среди числовых значений, извлеченных из агрегированных документов.
Агрегации min и max работают с представлением данных double. Вследствие этого результат может быть приблизительным при работе с числами типа long, абсолютное значение которых превышает 2^53.
Вычисление минимальной цены по всем документам:
resp = client.search(
index="sales",
size="0",
aggs={
"min_price": {
"min": {
"field": "price"
}
}
},
)
print(resp) response = client.search(
index: 'sales',
size: 0,
body: {
aggregations: {
min_price: {
min: {
field: 'price'
}
}
}
}
)
puts response const response = await client.search({
index: "sales",
size: 0,
aggs: {
min_price: {
min: {
field: "price",
},
},
},
});
console.log(response); POST /sales/_search?size=0
{
"aggs": {
"min_price": { "min": { "field": "price" } }
}
} Ответ:
{
...
"aggregations": {
"min_price": {
"value": 10.0
}
}
} Как можно заметить, имя агрегации (min_price выше) также служит ключом, по которому результат агрегации можно получить из возвращаемого ответа.
Скрипт
Если вам нужно получить min чего-то более сложного, чем одного поля, выполните агрегацию на поле runtime.
resp = client.search(
index="sales",
size=0,
runtime_mappings={
"price.adjusted": {
"type": "double",
"script": "\n double price = doc['price'].value;\n if (doc['promoted'].value) {\n price *= 0.8;\n }\n emit(price);\n "
}
},
aggs={
"min_price": {
"min": {
"field": "price.adjusted"
}
}
},
)
print(resp) response = client.search(
index: 'sales',
body: {
size: 0,
runtime_mappings: {
'price.adjusted' => {
type: 'double',
script: "\n double price = doc['price'].value;\n if (doc['promoted'].value) {\n price *= 0.8;\n }\n emit(price);\n "
}
},
aggregations: {
min_price: {
min: {
field: 'price.adjusted'
}
}
}
}
)
puts response const response = await client.search({
index: "sales",
size: 0,
runtime_mappings: {
"price.adjusted": {
type: "double",
script:
"\n double price = doc['price'].value;\n if (doc['promoted'].value) {\n price *= 0.8;\n }\n emit(price);\n ",
},
},
aggs: {
min_price: {
min: {
field: "price.adjusted",
},
},
},
});
console.log(response); POST /sales/_search
{
"size": 0,
"runtime_mappings": {
"price.adjusted": {
"type": "double",
"script": """
double price = doc['price'].value;
if (doc['promoted'].value) {
price *= 0.8;
}
emit(price);
"""
}
},
"aggs": {
"min_price": {
"min": { "field": "price.adjusted" }
}
}
} Отсутствующее значение
Параметр missing определяет, как должны обрабатываться документы, у которых отсутствует значение. По умолчанию они будут игнорироваться, но также можно обработать их так, как если бы у них было значение.
resp = client.search(
index="sales",
aggs={
"grade_min": {
"min": {
"field": "grade",
"missing": 10
}
}
},
)
print(resp) response = client.search(
index: 'sales',
body: {
aggregations: {
grade_min: {
min: {
field: 'grade',
missing: 10
}
}
}
}
)
puts response const response = await client.search({
index: "sales",
aggs: {
grade_min: {
min: {
field: "grade",
missing: 10,
},
},
},
});
console.log(response); POST /sales/_search
{
"aggs": {
"grade_min": {
"min": {
"field": "grade",
"missing": 10
}
}
}
} | Документы без значения в поле |
Поля гистограммы
Когда min вычисляется для полей гистограммы, результатом агрегации является минимум всех элементов в массиве values. Обратите внимание, что массив counts гистограммы игнорируется.
Например, для следующего индекса, который хранит предварительно агрегированные гистограммы с метриками задержки для разных сетей:
resp = client.indices.create(
index="metrics_index",
mappings={
"properties": {
"latency_histo": {
"type": "histogram"
}
}
},
)
print(resp)
resp1 = client.index(
index="metrics_index",
id="1",
refresh=True,
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(resp1)
resp2 = client.index(
index="metrics_index",
id="2",
refresh=True,
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(resp2)
resp3 = client.search(
index="metrics_index",
size="0",
filter_path="aggregations",
aggs={
"min_latency": {
"min": {
"field": "latency_histo"
}
}
},
)
print(resp3) response = client.indices.create(
index: 'metrics_index',
body: {
mappings: {
properties: {
latency_histo: {
type: 'histogram'
}
}
}
}
)
puts response
response = client.index(
index: 'metrics_index',
id: 1,
refresh: true,
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,
refresh: true,
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,
filter_path: 'aggregations',
body: {
aggregations: {
min_latency: {
min: {
field: 'latency_histo'
}
}
}
}
)
puts response const response = await client.indices.create({
index: "metrics_index",
mappings: {
properties: {
latency_histo: {
type: "histogram",
},
},
},
});
console.log(response);
const response1 = await client.index({
index: "metrics_index",
id: 1,
refresh: "true",
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(response1);
const response2 = await client.index({
index: "metrics_index",
id: 2,
refresh: "true",
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(response2);
const response3 = await client.search({
index: "metrics_index",
size: 0,
filter_path: "aggregations",
aggs: {
min_latency: {
min: {
field: "latency_histo",
},
},
},
});
console.log(response3); PUT metrics_index
{
"mappings": {
"properties": {
"latency_histo": { "type": "histogram" }
}
}
}
PUT metrics_index/_doc/1?refresh
{
"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?refresh
{
"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&filter_path=aggregations
{
"aggs" : {
"min_latency" : { "min" : { "field" : "latency_histo" } }
}
} Агрегация min вернет минимальное значение всех полей гистограммы:
{
"aggregations": {
"min_latency": {
"value": 0.1
}
}
}
© 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-min-aggregation.html