Elasticsearch算术和嵌套聚合

时间:2016-11-17 15:55:22

标签: elasticsearch

我在ElasticSearch中有这种对象:

"myobject": {
  "type": "blah",
   "events": [
    {
      "code": "code1"
      "date": "2016-08-03 18:00:00"
    },
    {
      "code": "code2"
      "date": "2016-08-03 20:00:00"
    }
  ]
}

我想计算代码为“code1”的事件和类型为“code2”的事件之间的平均花费时间。基本上,我需要从每个对象的“code1”日期中减去“code2”的日期,然后计算平均值。

谢谢你的帮助!

1 个答案:

答案 0 :(得分:0)

B计划绝对好多了。你可以做任何你在索引时可以做的事情。如果您知道您需要该日期差异,那么您应该在索引时计算它并将其存储到另一个字段中。

你绝对应该不担心存储冗余数据,Elasticsearch并不关心。在每次查询期间,除了执行大量脚本之外,您的群集将比存储更多字段更好。您的用户也会感激,因为随着数据的增长,他们不必等待多年才能得到答案。

因此存储它(time_spent是第二个和第一个事件之间的毫秒数):

"myobject": {
  "type": "blah",
   "time_spent": 7200000,
   "events": [
    {
      "code": "code1"
      "date": "2016-08-03 18:00:00"
    },
    {
      "code": "code2"
      "date": "2016-08-03 20:00:00"
    }
  ]
}

然后您就可以运行如下的简单聚合查询:

{
  "size": 0,
  "aggs": {
    "avg_duration": {
      "avg": {
        "field": "time_spent"
      }
    }
  }
}