ロールアップ検索
8.11.0で非推奨
ロールアップは将来のバージョンで削除されます。代わりにダウンサンプリングを使用してください。
標準のクエリDSLを使用してロールアップデータを検索することを可能にします。
リクエスト
GET <target>/_rollup_search
説明
ロールアップ検索エンドポイントが必要なのは、内部的にロールアップされたドキュメントが元のデータとは異なるドキュメント構造を利用しているためです。ロールアップ検索エンドポイントは、標準のクエリDSLをロールアップドキュメントに一致する形式に書き換え、応答を受け取って元のクエリに基づいてクライアントが期待する形式に再度書き換えます。
パスパラメータ
<target>
- (必須、文字列) リクエストを制限するために使用されるデータストリームとインデックスのカンマ区切りリスト。ワイルドカード表現(
*
)がサポートされています。
このターゲットには、ロールアップインデックスと非ロールアップインデックスの両方を含めることができます。<target>
パラメータのルール:- 少なくとも1つのデータストリーム、インデックス、またはワイルドカード表現を指定する必要があります。このターゲットにはロールアップインデックスまたは非ロールアップインデックスを含めることができます。データストリームの場合、ストリームのバックインデックスは非ロールアップインデックスとしてのみ機能します。
<target>
パラメータを省略するか、_all
を使用することは許可されていません。 - 複数の非ロールアップインデックスを指定することができます。
- 1つのロールアップインデックスのみを指定できます。複数指定した場合、例外が発生します。
- ワイルドカード表現を使用できますが、複数のロールアップインデックスに一致する場合、例外が発生します。ただし、複数の非ロールアップインデックスまたはデータストリームに一致する表現を使用することはできます。
- 少なくとも1つのデータストリーム、インデックス、またはワイルドカード表現を指定する必要があります。このターゲットにはロールアップインデックスまたは非ロールアップインデックスを含めることができます。データストリームの場合、ストリームのバックインデックスは非ロールアップインデックスとしてのみ機能します。
リクエストボディ
リクエストボディは、通常の検索APIの機能のサブセットをサポートしています。サポートされているのは:
query
パラメータは、いくつかの制限の対象となるDSLクエリを指定するためのものです(ロールアップ検索の制限およびロールアップ集約の制限を参照)aggregations
パラメータは、集約を指定するためのものです
利用できない機能:
size
: ロールアップは事前集約データで機能するため、検索ヒットは返されず、サイズはゼロに設定するか完全に省略する必要があります。highlighter
、suggestors
、post_filter
、profile
、explain
: これらも同様に許可されていません。
例
履歴のみの検索例
生データで満たされたsensor-1
という名前のインデックスがあり、次の構成でロールアップジョブを作成したと想像してください:
Python
resp = client.rollup.put_job(
id="sensor",
index_pattern="sensor-*",
rollup_index="sensor_rollup",
cron="*/30 * * * * ?",
page_size=1000,
groups={
"date_histogram": {
"field": "timestamp",
"fixed_interval": "1h",
"delay": "7d"
},
"terms": {
"fields": [
"node"
]
}
},
metrics=[
{
"field": "temperature",
"metrics": [
"min",
"max",
"sum"
]
},
{
"field": "voltage",
"metrics": [
"avg"
]
}
],
)
print(resp)
Js
const response = await client.rollup.putJob({
id: "sensor",
index_pattern: "sensor-*",
rollup_index: "sensor_rollup",
cron: "*/30 * * * * ?",
page_size: 1000,
groups: {
date_histogram: {
field: "timestamp",
fixed_interval: "1h",
delay: "7d",
},
terms: {
fields: ["node"],
},
},
metrics: [
{
field: "temperature",
metrics: ["min", "max", "sum"],
},
{
field: "voltage",
metrics: ["avg"],
},
],
});
console.log(response);
コンソール
PUT _rollup/job/sensor
{
"index_pattern": "sensor-*",
"rollup_index": "sensor_rollup",
"cron": "*/30 * * * * ?",
"page_size": 1000,
"groups": {
"date_histogram": {
"field": "timestamp",
"fixed_interval": "1h",
"delay": "7d"
},
"terms": {
"fields": [ "node" ]
}
},
"metrics": [
{
"field": "temperature",
"metrics": [ "min", "max", "sum" ]
},
{
"field": "voltage",
"metrics": [ "avg" ]
}
]
}
このコマンドはsensor-*
パターンをロールアップし、結果をsensor_rollup
に保存します。このロールアップデータを検索するには、_rollup_search
エンドポイントを使用する必要があります。ただし、ロールアップデータを検索するために通常のクエリDSLを使用できることに注意してください:
Python
resp = client.rollup.rollup_search(
index="sensor_rollup",
size=0,
aggregations={
"max_temperature": {
"max": {
"field": "temperature"
}
}
},
)
print(resp)
Ruby
response = client.rollup.rollup_search(
index: 'sensor_rollup',
body: {
size: 0,
aggregations: {
max_temperature: {
max: {
field: 'temperature'
}
}
}
}
)
puts response
Js
const response = await client.rollup.rollupSearch({
index: "sensor_rollup",
size: 0,
aggregations: {
max_temperature: {
max: {
field: "temperature",
},
},
},
});
console.log(response);
コンソール
GET /sensor_rollup/_rollup_search
{
"size": 0,
"aggregations": {
"max_temperature": {
"max": {
"field": "temperature"
}
}
}
}
クエリはsensor_rollup
データをターゲットにしており、これはジョブで構成されたロールアップデータを含んでいます。max
集約がtemperature
フィールドに使用され、次の応答が得られます:
コンソール-結果
{
"took" : 102,
"timed_out" : false,
"terminated_early" : false,
"_shards" : ... ,
"hits" : {
"total" : {
"value": 0,
"relation": "eq"
},
"max_score" : 0.0,
"hits" : [ ]
},
"aggregations" : {
"max_temperature" : {
"value" : 202.0
}
}
}
応答は、通常のクエリ+集約から期待される通りであり、リクエストに関するメタデータ(took
、_shards
など)、検索ヒット(ロールアップ検索では常に空)、および集約応答を提供します。
ロールアップ検索は、ロールアップジョブで構成された機能に制限されています。たとえば、avg
がtemperature
フィールドの構成されたメトリックの1つでなかったため、平均温度を計算することはできません。その検索を実行しようとすると:
Python
resp = client.rollup.rollup_search(
index="sensor_rollup",
size=0,
aggregations={
"avg_temperature": {
"avg": {
"field": "temperature"
}
}
},
)
print(resp)
Ruby
response = client.rollup.rollup_search(
index: 'sensor_rollup',
body: {
size: 0,
aggregations: {
avg_temperature: {
avg: {
field: 'temperature'
}
}
}
}
)
puts response
Js
const response = await client.rollup.rollupSearch({
index: "sensor_rollup",
size: 0,
aggregations: {
avg_temperature: {
avg: {
field: "temperature",
},
},
},
});
console.log(response);
コンソール
GET sensor_rollup/_rollup_search
{
"size": 0,
"aggregations": {
"avg_temperature": {
"avg": {
"field": "temperature"
}
}
}
}
コンソール-結果
{
"error": {
"root_cause": [
{
"type": "illegal_argument_exception",
"reason": "There is not a rollup job that has a [avg] agg with name [avg_temperature] which also satisfies all requirements of query.",
"stack_trace": ...
}
],
"type": "illegal_argument_exception",
"reason": "There is not a rollup job that has a [avg] agg with name [avg_temperature] which also satisfies all requirements of query.",
"stack_trace": ...
},
"status": 400
}
履歴のロールアップデータと非ロールアップデータの両方を検索
ロールアップ検索APIは、”ライブ”非ロールアップデータと集約されたロールアップデータの両方を検索する機能を持っています。これは、URIにライブインデックスを追加することで実現されます:
Python
resp = client.rollup.rollup_search(
index="sensor-1,sensor_rollup",
size=0,
aggregations={
"max_temperature": {
"max": {
"field": "temperature"
}
}
},
)
print(resp)
Ruby
response = client.rollup.rollup_search(
index: 'sensor-1,sensor_rollup',
body: {
size: 0,
aggregations: {
max_temperature: {
max: {
field: 'temperature'
}
}
}
}
)
puts response
Js
const response = await client.rollup.rollupSearch({
index: "sensor-1,sensor_rollup",
size: 0,
aggregations: {
max_temperature: {
max: {
field: "temperature",
},
},
},
});
console.log(response);
コンソール
GET sensor-1,sensor_rollup/_rollup_search
{
"size": 0,
"aggregations": {
"max_temperature": {
"max": {
"field": "temperature"
}
}
}
}
URIがsensor-1 とsensor_rollup を同時に検索することに注意してください |
検索が実行されると、ロールアップ検索エンドポイントは2つのことを行います:
- 1. 元のリクエストは非ロールアップインデックスに変更されずに送信されます。
- 2. 元のリクエストの書き換え版がロールアップインデックスに送信されます。
2つの応答が受信されると、エンドポイントはロールアップ応答を書き換え、2つを統合します。統合プロセス中に、2つの応答間でバケットに重複がある場合、非ロールアップインデックスのバケットが使用されます。
上記のクエリに対する応答は、ロールアップインデックスと非ロールアップインデックスをまたいでいるにもかかわらず、期待通りのものになります:
コンソール-結果
{
"took" : 102,
"timed_out" : false,
"terminated_early" : false,
"_shards" : ... ,
"hits" : {
"total" : {
"value": 0,
"relation": "eq"
},
"max_score" : 0.0,
"hits" : [ ]
},
"aggregations" : {
"max_temperature" : {
"value" : 202.0
}
}
}