使用Elasticsearch版本为5.4.2
我想构建一个Elasticsearch查询来满足三个条件。
我做了1和2.但我找不到解决方案3.是否可以在查询中执行1到3?为了以防万一,我将在Laravel 5.4(PHP框架之一)上使用结果。
我的数据格式如下:
"_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"
}
}
}
}
}
}
}
}
答案 0 :(得分:1)
正如@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"
}
}
}
}
}
}
答案 1 :(得分:0)
如果我正确理解您的目标,您应该能够使用pipeline aggregations解决此问题。更具体地说,对于您的用例,Avg Bucket aggregation应该会有所帮助,请查看文档中的示例,该示例应该与您认为的内容非常接近。
类似的东西:
"avg_min_buying_time": {
"avg_bucket": {
"buckets_path": "games>min_buying_time"
}
}