[英]How to calculate average minimal times in Elasticsearch?
使用Elasticsearch版本是5.4.2
我想建立一個Elasticsearch查詢來滿足三個條件。
我做了1和2。但是我找不到解決方法3。可以在查詢中執行1到3嗎? 以防萬一,我將在PHP框架之一的Laravel 5.4上使用結果。
我的數據格式如下:
"_index": "timelines",
"_type": "timeline"
"_source": {
"gameId": 152735348,
"participantId": 3,
"championId": 35,
"role": "NONE",
"lane": "JUNGLE",
"win": 1,
"itemId": 1036,
"timestamp": 571200
}
我當前的Elasticsearch查詢是這樣
GET timelines/_search?size=0&pretty
{
"query": {
"bool": {
"must": [
{ "match": { "championId": 22 }}
]
}
},
"aggs": {
"games": {
"terms": {
"field": "gameId"
},
"aggs": {
"items": {
"terms": {
"field": "itemId",
"order" : { "min_buying_time" : "asc" }
},
"aggs": {
"min_buying_time": {
"min": {
"field": "timestamp"
}
}
}
}
}
}
}
}
正如@SönkeLiebau所說,管道聚合是關鍵,但是如果您要計算每個項目所有游戲的平均最短時間,則應首先按itemID進行聚合。 以下代碼應有所幫助:
POST misko/_search
{
"query": {
"bool": {
"must": [
{ "match": { "championId": 22 }}
]
}
},
"aggs": {
"items": {
"terms": {
"field": "itemId"
},
"aggs": {
"games": {
"terms": {
"field": "gameId"
},
"aggs": {
"min_buying_time": {
"min": {
"field": "timestamp"
}
}
}
},
"avg_min_time": {
"avg_bucket": {
"buckets_path": "games>min_buying_time"
}
}
}
}
}
}
如果我正確地理解了您的目標,那么您應該可以使用管道聚合來解決此問題。 更具體地說,對於您的用例, Avg Bucket聚合應該會有所幫助,請查看文檔中的示例,該示例應該非常接近您的需求。
就像是:
"avg_min_buying_time": {
"avg_bucket": {
"buckets_path": "games>min_buying_time"
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.