Avg aggregation
文書から抽出された数値の平均を計算する single-value
メトリクス集約です。これらの値は、文書内の特定の数値または ヒストグラム フィールドから抽出できます。
データが学生の試験成績(0から100の間)を表す文書で構成されていると仮定すると、次のようにしてスコアの平均を計算できます:
Python
resp = client.search(
index="exams",
size="0",
aggs={
"avg_grade": {
"avg": {
"field": "grade"
}
}
},
)
print(resp)
Ruby
response = client.search(
index: 'exams',
size: 0,
body: {
aggregations: {
avg_grade: {
avg: {
field: 'grade'
}
}
}
}
)
puts response
Js
const response = await client.search({
index: "exams",
size: 0,
aggs: {
avg_grade: {
avg: {
field: "grade",
},
},
},
});
console.log(response);
Console
POST /exams/_search?size=0
{
"aggs": {
"avg_grade": { "avg": { "field": "grade" } }
}
}
上記の集約は、すべての文書の平均成績を計算します。集約タイプは avg
で、field
設定は平均が計算される文書の数値フィールドを定義します。上記は次の結果を返します:
Console-Result
{
...
"aggregations": {
"avg_grade": {
"value": 75.0
}
}
}
集約の名前(上記の avg_grade
)は、返されたレスポンスから集約結果を取得するためのキーとしても機能します。
Script
試験が非常に難しかったとしましょう。成績の修正を適用する必要があります。 ランタイムフィールド の平均を計算して修正された平均を取得します:
Python
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)
Ruby
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
Js
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);
Console
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 value
missing
パラメータは、値が欠落している文書がどのように扱われるべきかを定義します。デフォルトでは無視されますが、値があるかのように扱うことも可能です。
Python
resp = client.search(
index="exams",
size="0",
aggs={
"grade_avg": {
"avg": {
"field": "grade",
"missing": 10
}
}
},
)
print(resp)
Ruby
response = client.search(
index: 'exams',
size: 0,
body: {
aggregations: {
grade_avg: {
avg: {
field: 'grade',
missing: 10
}
}
}
}
)
puts response
Js
const response = await client.search({
index: "exams",
size: 0,
aggs: {
grade_avg: {
avg: {
field: "grade",
missing: 10,
},
},
},
});
console.log(response);
Console
POST /exams/_search?size=0
{
"aggs": {
"grade_avg": {
"avg": {
"field": "grade",
"missing": 10
}
}
}
}
grade フィールドに値がない文書は、値が 10 の文書と同じバケットに入ります。 |
Histogram fields
ヒストグラムフィールド に対して平均が計算されると、集約の結果は values
配列内のすべての要素の加重平均であり、counts
配列内の同じ位置の数を考慮します。
たとえば、異なるネットワークのレイテンシメトリクスを持つ事前集約されたヒストグラムを保存する次のインデックスの場合:
Python
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)
Ruby
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
Js
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);
Console
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
配列内の各数値 \u0026lt;1\u0026gt; を、その関連するカウントが counts
配列内にあるもの \u0026lt;2\u0026gt; で掛け算します。最終的に、すべてのヒストグラムのこれらの値の平均を計算し、次の結果を返します:
Console-Result
{
...
"aggregations": {
"avg_latency": {
"value": 0.29690721649
}
}
}