レート集約
rate
メトリクス集約は、date_histogram
または composite
集約の内部でのみ使用できます。これは、各バケット内のドキュメントまたはフィールドのレートを計算します。フィールドの値は、ドキュメント内の特定の数値または ヒストグラムフィールド から抽出できます。
composite
集約の場合、rate
集約がサポートされるためには、date_histogram
ソースが正確に1つ必要です。
構文
rate
集約は、単独で次のようになります:
Js
{
"rate": {
"unit": "month",
"field": "requests"
}
}
次のリクエストは、すべての販売記録を月ごとのバケットにグループ化し、各バケット内の販売取引の数を年間販売レートに変換します。
Python
resp = client.search(
index="sales",
size=0,
aggs={
"by_date": {
"date_histogram": {
"field": "date",
"calendar_interval": "month"
},
"aggs": {
"my_rate": {
"rate": {
"unit": "year"
}
}
}
}
},
)
print(resp)
Ruby
response = client.search(
index: 'sales',
body: {
size: 0,
aggregations: {
by_date: {
date_histogram: {
field: 'date',
calendar_interval: 'month'
},
aggregations: {
my_rate: {
rate: {
unit: 'year'
}
}
}
}
}
}
)
puts response
Js
const response = await client.search({
index: "sales",
size: 0,
aggs: {
by_date: {
date_histogram: {
field: "date",
calendar_interval: "month",
},
aggs: {
my_rate: {
rate: {
unit: "year",
},
},
},
},
},
});
console.log(response);
コンソール
GET sales/_search
{
"size": 0,
"aggs": {
"by_date": {
"date_histogram": {
"field": "date",
"calendar_interval": "month"
},
"aggs": {
"my_rate": {
"rate": {
"unit": "year"
}
}
}
}
}
}
ヒストグラムは月ごとにグループ化されています。 | |
しかし、レートは年間レートに変換されます。 |
レスポンスは、各バケット内の取引の年間レートを返します。1年は12ヶ月なので、年間レートは月間レートに12を掛けることで自動的に計算されます。
コンソール-結果
{
...
"aggregations" : {
"by_date" : {
"buckets" : [
{
"key_as_string" : "2015/01/01 00:00:00",
"key" : 1420070400000,
"doc_count" : 3,
"my_rate" : {
"value" : 36.0
}
},
{
"key_as_string" : "2015/02/01 00:00:00",
"key" : 1422748800000,
"doc_count" : 2,
"my_rate" : {
"value" : 24.0
}
},
{
"key_as_string" : "2015/03/01 00:00:00",
"key" : 1425168000000,
"doc_count" : 2,
"my_rate" : {
"value" : 24.0
}
}
]
}
}
}
ドキュメントの数をカウントする代わりに、各バケット内のドキュメントのフィールドのすべての値の合計や、各バケット内の値の数を計算することも可能です。次のリクエストは、すべての販売記録を月ごとのバケットにグループ化し、総月間販売を計算し、それを平均日間販売に変換します。
Python
resp = client.search(
index="sales",
size=0,
aggs={
"by_date": {
"date_histogram": {
"field": "date",
"calendar_interval": "month"
},
"aggs": {
"avg_price": {
"rate": {
"field": "price",
"unit": "day"
}
}
}
}
},
)
print(resp)
Ruby
response = client.search(
index: 'sales',
body: {
size: 0,
aggregations: {
by_date: {
date_histogram: {
field: 'date',
calendar_interval: 'month'
},
aggregations: {
avg_price: {
rate: {
field: 'price',
unit: 'day'
}
}
}
}
}
}
)
puts response
Js
const response = await client.search({
index: "sales",
size: 0,
aggs: {
by_date: {
date_histogram: {
field: "date",
calendar_interval: "month",
},
aggs: {
avg_price: {
rate: {
field: "price",
unit: "day",
},
},
},
},
},
});
console.log(response);
コンソール
GET sales/_search
{
"size": 0,
"aggs": {
"by_date": {
"date_histogram": {
"field": "date",
"calendar_interval": "month"
},
"aggs": {
"avg_price": {
"rate": {
"field": "price",
"unit": "day"
}
}
}
}
}
}
ヒストグラムは月ごとにグループ化されています。 | |
すべての販売価格の合計を計算します | |
平均日間販売に変換します |
コンソール-結果
{
...
"aggregations" : {
"by_date" : {
"buckets" : [
{
"key_as_string" : "2015/01/01 00:00:00",
"key" : 1420070400000,
"doc_count" : 3,
"avg_price" : {
"value" : 17.741935483870968
}
},
{
"key_as_string" : "2015/02/01 00:00:00",
"key" : 1422748800000,
"doc_count" : 2,
"avg_price" : {
"value" : 2.142857142857143
}
},
{
"key_as_string" : "2015/03/01 00:00:00",
"key" : 1425168000000,
"doc_count" : 2,
"avg_price" : {
"value" : 12.096774193548388
}
}
]
}
}
}
composite
集約を利用して、在庫内の各アイテムの平均日間販売価格を計算することもできます。
Python
resp = client.search(
index="sales",
filter_path="aggregations",
size="0",
aggs={
"buckets": {
"composite": {
"sources": [
{
"month": {
"date_histogram": {
"field": "date",
"calendar_interval": "month"
}
}
},
{
"type": {
"terms": {
"field": "type"
}
}
}
]
},
"aggs": {
"avg_price": {
"rate": {
"field": "price",
"unit": "day"
}
}
}
}
},
)
print(resp)
Ruby
response = client.search(
index: 'sales',
filter_path: 'aggregations',
size: 0,
body: {
aggregations: {
buckets: {
composite: {
sources: [
{
month: {
date_histogram: {
field: 'date',
calendar_interval: 'month'
}
}
},
{
type: {
terms: {
field: 'type'
}
}
}
]
},
aggregations: {
avg_price: {
rate: {
field: 'price',
unit: 'day'
}
}
}
}
}
}
)
puts response
Js
const response = await client.search({
index: "sales",
filter_path: "aggregations",
size: 0,
aggs: {
buckets: {
composite: {
sources: [
{
month: {
date_histogram: {
field: "date",
calendar_interval: "month",
},
},
},
{
type: {
terms: {
field: "type",
},
},
},
],
},
aggs: {
avg_price: {
rate: {
field: "price",
unit: "day",
},
},
},
},
},
});
console.log(response);
コンソール
GET sales/_search?filter_path=aggregations&size=0
{
"aggs": {
"buckets": {
"composite": {
"sources": [
{
"month": {
"date_histogram": {
"field": "date",
"calendar_interval": "month"
}
}
},
{
"type": {
"terms": {
"field": "type"
}
}
}
]
},
"aggs": {
"avg_price": {
"rate": {
"field": "price",
"unit": "day"
}
}
}
}
}
}
日付ヒストグラムソースを持つ複合集約 アイテムタイプのソース。 |
|
日付ヒストグラムソースは月ごとにグループ化されます | |
各販売アイテムタイプのための用語ソースのグループ化 | |
すべての販売価格の合計を計算し、月ごとおよびアイテムごとに | |
アイテムごとの平均日間販売に変換します |
レスポンスには、各月のアイテムごとの平均日間販売価格が含まれます。
コンソール-結果
{
"aggregations" : {
"buckets" : {
"after_key" : {
"month" : 1425168000000,
"type" : "t-shirt"
},
"buckets" : [
{
"key" : {
"month" : 1420070400000,
"type" : "bag"
},
"doc_count" : 1,
"avg_price" : {
"value" : 4.838709677419355
}
},
{
"key" : {
"month" : 1420070400000,
"type" : "hat"
},
"doc_count" : 1,
"avg_price" : {
"value" : 6.451612903225806
}
},
{
"key" : {
"month" : 1420070400000,
"type" : "t-shirt"
},
"doc_count" : 1,
"avg_price" : {
"value" : 6.451612903225806
}
},
{
"key" : {
"month" : 1422748800000,
"type" : "hat"
},
"doc_count" : 1,
"avg_price" : {
"value" : 1.7857142857142858
}
},
{
"key" : {
"month" : 1422748800000,
"type" : "t-shirt"
},
"doc_count" : 1,
"avg_price" : {
"value" : 0.35714285714285715
}
},
{
"key" : {
"month" : 1425168000000,
"type" : "hat"
},
"doc_count" : 1,
"avg_price" : {
"value" : 6.451612903225806
}
},
{
"key" : {
"month" : 1425168000000,
"type" : "t-shirt"
},
"doc_count" : 1,
"avg_price" : {
"value" : 5.645161290322581
}
}
]
}
}
}
mode
パラメータに値 value_count
を追加することで、計算を sum
からフィールドの値の数に変更できます:
Python
resp = client.search(
index="sales",
size=0,
aggs={
"by_date": {
"date_histogram": {
"field": "date",
"calendar_interval": "month"
},
"aggs": {
"avg_number_of_sales_per_year": {
"rate": {
"field": "price",
"unit": "year",
"mode": "value_count"
}
}
}
}
},
)
print(resp)
Ruby
response = client.search(
index: 'sales',
body: {
size: 0,
aggregations: {
by_date: {
date_histogram: {
field: 'date',
calendar_interval: 'month'
},
aggregations: {
avg_number_of_sales_per_year: {
rate: {
field: 'price',
unit: 'year',
mode: 'value_count'
}
}
}
}
}
}
)
puts response
Js
const response = await client.search({
index: "sales",
size: 0,
aggs: {
by_date: {
date_histogram: {
field: "date",
calendar_interval: "month",
},
aggs: {
avg_number_of_sales_per_year: {
rate: {
field: "price",
unit: "year",
mode: "value_count",
},
},
},
},
},
});
console.log(response);
コンソール
GET sales/_search
{
"size": 0,
"aggs": {
"by_date": {
"date_histogram": {
"field": "date",
"calendar_interval": "month"
},
"aggs": {
"avg_number_of_sales_per_year": {
"rate": {
"field": "price",
"unit": "year",
"mode": "value_count"
}
}
}
}
}
}
ヒストグラムは月ごとにグループ化されています。 | |
すべての販売価格の数を計算します | |
年間カウントに変換します | |
モードを値カウントに変更します |
コンソール-結果
{
...
"aggregations" : {
"by_date" : {
"buckets" : [
{
"key_as_string" : "2015/01/01 00:00:00",
"key" : 1420070400000,
"doc_count" : 3,
"avg_number_of_sales_per_year" : {
"value" : 36.0
}
},
{
"key_as_string" : "2015/02/01 00:00:00",
"key" : 1422748800000,
"doc_count" : 2,
"avg_number_of_sales_per_year" : {
"value" : 24.0
}
},
{
"key_as_string" : "2015/03/01 00:00:00",
"key" : 1425168000000,
"doc_count" : 2,
"avg_number_of_sales_per_year" : {
"value" : 24.0
}
}
]
}
}
}
デフォルトでは sum
モードが使用されます。
"mode": "sum"
- すべての値フィールドの合計を計算します
"mode": "value_count"
- フィールド内の値の数を使用します
バケットサイズとレートの関係
rate
集約は、date_histogram
集約の calendar_intervals パラメータ で使用できるすべてのレートをサポートします。指定されたレートは、date_histogram
集約の間隔と互換性がある必要があります。つまり、バケットサイズをレートに変換できる必要があります。デフォルトでは date_histogram
の間隔が使用されます。
"rate": "second"
- すべての間隔と互換性があります
"rate": "minute"
- すべての間隔と互換性があります
"rate": "hour"
- すべての間隔と互換性があります
"rate": "day"
- すべての間隔と互換性があります
"rate": "week"
- すべての間隔と互換性があります
"rate": "month"
month
、quarter
、year
カレンダー間隔とのみ互換性があります"rate": "quarter"
month
、quarter
、year
カレンダー間隔とのみ互換性があります"rate": "year"
month
、quarter
、year
カレンダー間隔とのみ互換性があります
日付ヒストグラムがレートヒストグラムの直接の親でない場合、追加の制限があります。この場合、レート間隔とヒストグラム間隔は同じグループに属する必要があります: [second
, minute
, hour
, day
, week
] または [month
, quarter
, year
]。たとえば、日付ヒストグラムが month
ベースの場合、month
、quarter
、または year
のレート間隔のみがサポートされます。日付ヒストグラムが day
ベースの場合、second
、minute
、hour
、day
、week
のレート間隔のみがサポートされます。
スクリプト
インデックスされていない値に対して集約を実行する必要がある場合は、ランタイムフィールド で集約を実行します。たとえば、レートを計算する前に価格を調整する必要がある場合:
Python
resp = client.search(
index="sales",
size=0,
runtime_mappings={
"price.adjusted": {
"type": "double",
"script": {
"source": "emit(doc['price'].value * params.adjustment)",
"params": {
"adjustment": 0.9
}
}
}
},
aggs={
"by_date": {
"date_histogram": {
"field": "date",
"calendar_interval": "month"
},
"aggs": {
"avg_price": {
"rate": {
"field": "price.adjusted"
}
}
}
}
},
)
print(resp)
Ruby
response = client.search(
index: 'sales',
body: {
size: 0,
runtime_mappings: {
'price.adjusted' => {
type: 'double',
script: {
source: "emit(doc['price'].value * params.adjustment)",
params: {
adjustment: 0.9
}
}
}
},
aggregations: {
by_date: {
date_histogram: {
field: 'date',
calendar_interval: 'month'
},
aggregations: {
avg_price: {
rate: {
field: 'price.adjusted'
}
}
}
}
}
}
)
puts response
Js
const response = await client.search({
index: "sales",
size: 0,
runtime_mappings: {
"price.adjusted": {
type: "double",
script: {
source: "emit(doc['price'].value * params.adjustment)",
params: {
adjustment: 0.9,
},
},
},
},
aggs: {
by_date: {
date_histogram: {
field: "date",
calendar_interval: "month",
},
aggs: {
avg_price: {
rate: {
field: "price.adjusted",
},
},
},
},
},
});
console.log(response);
コンソール
GET sales/_search
{
"size": 0,
"runtime_mappings": {
"price.adjusted": {
"type": "double",
"script": {
"source": "emit(doc['price'].value * params.adjustment)",
"params": {
"adjustment": 0.9
}
}
}
},
"aggs": {
"by_date": {
"date_histogram": {
"field": "date",
"calendar_interval": "month"
},
"aggs": {
"avg_price": {
"rate": {
"field": "price.adjusted"
}
}
}
}
}
}
コンソール-結果
{
...
"aggregations" : {
"by_date" : {
"buckets" : [
{
"key_as_string" : "2015/01/01 00:00:00",
"key" : 1420070400000,
"doc_count" : 3,
"avg_price" : {
"value" : 495.0
}
},
{
"key_as_string" : "2015/02/01 00:00:00",
"key" : 1422748800000,
"doc_count" : 2,
"avg_price" : {
"value" : 54.0
}
},
{
"key_as_string" : "2015/03/01 00:00:00",
"key" : 1425168000000,
"doc_count" : 2,
"avg_price" : {
"value" : 337.5
}
}
]
}
}
}