如何计算Elasticsearch的平均最短时间?

时间:2017-08-08 09:58:18

标签: php laravel elasticsearch

使用Elasticsearch版本为5.4.2

我想构建一个Elasticsearch查询来满足三个条件。

  1. 按championId过滤
  2. 每次游戏购买各种物品的时间最短
  3. 计算所有游戏中每个项目的平均最短时间。
  4. 我做了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"
                 }
               }
             }
           }
         }
       }
      }
    }
    

2 个答案:

答案 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" 
      }
    }
相关问题