2017-08-08 87 views
0

使用Elasticsearch版本是5.4.2如何计算Elasticsearch的平均最短时间?

我想建立一个Elasticsearch查询以满足三个条件。

  1. 过滤器由championId
  2. 得到最少的时间来购买每场比赛各项目
  3. 中计算平均最少的时间来购买所有游戏每个项目。

我做了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

如果我理解你的目标正确,您应该能够pipeline aggregations来解决这个问题。更具体地说,对于您的使用情况,Avg Bucket aggregation应该很有帮助,请查看文档中的示例,该示例应该非常接近您所需要的内容。

喜欢的东西:

"avg_min_buying_time": { 
     "avg_bucket": { 
     "buckets_path": "games>min_buying_time" 
     } 
    } 
+0

Sönke,谢谢你的建议。我从来没有听说过“管道集合”这个词。我要检查你告诉的网页。 :) – hikozuma

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" 
     } 
     } 
    } 
    } 
    } 
} 
+0

米哈尔,谢谢你的建议。我将检查2种方式,以及哪种方式是正确的:gameId - > itemId(我的方式),itemId - > gameId(您的方式)。 :) – hikozuma

+0

没问题。 :) 让我知道。 –

+0

我发现你的方式是正确的。我的查询结果包含每场比赛所有项目的平均最低购买时间。这没有道理。但是,您的查询结果包含每件商品所有游戏的平均最低购买时间。这就是我需要的!非常感谢你。 – hikozuma