【问题标题】:Elasticsearch: Aggregate documents based on date rangeElasticsearch:根据日期范围聚合文档
【发布时间】:2018-01-09 10:17:17
【问题描述】:

我在 ElasticSearch 5.5 中有一组文档,其中包含两个日期字段:start_date 和 end_date。 我想将它们聚合到日期直方图存储桶中(例如:每周),这样如果 start_date

考虑以下具体示例:我有一组描述公司员工的文档,并且对于每个员工,您都有雇用日期和(可选)终止日期。我想建立过去 12 个月的活跃员工数量的日期直方图。

示例文档内容:

{
   "start_date": "2013-01-12T00:00:00.000Z",
   "end_date": "2016-12-08T00:00:00.000Z",
   "id": "123123123"
}

有没有办法在 ES 中做到这一点?

【问题讨论】:

  • 始终使用正确的 json 来支持您的问题,以向用例展示示例。谢谢
  • 加了一个,虽然感觉没有增加很多价值
  • 它不是关于价值,而是关于当我阅读这篇文章时,我应该能够更好地想象你的问题,显然推动格式化的 json 并没有太大的伤害。
  • 我怀疑一个文档可以出现在一个聚合的多个存储桶中。我可以建议检查scripting for date aggregation,使用pipeline aggregations 并对数据进行非规范化,例如预先计算 start_dateend_date 之间的所有星期,并将它们作为列表存储在字段 active_weeks 中。
  • @NikolayVasiliev 我找到了一种方法(检查我的答案),但我仍然对此不满意。也许脚本是一种更好的前进方式

标签: elasticsearch elasticsearch-5 elasticsearch-aggregation date-histogram


【解决方案1】:

我找到了一种方法,使用过滤器聚合( https://www.elastic.co/guide/en/elasticsearch/reference/master/search-aggregations-bucket-filter-aggregation.html)。例如,如果我需要 12 个尾随月份的报告,那么我将创建 12 个存储桶,其中每个存储桶定义过滤条件,例如:

"bool":{
 "must":[{
  "range":{
   "start_date":{
    "lte":"2016-01-01T00:00:00.000Z"
   }
  }
 },{
 {
  "range":{
   "end_date":{
    "gt":"2016-02-01T00:00:00.000Z"
   }
  }
 }]
}

但是,我觉得如果有更简单的方法来做到这一点会很好,因为如果我想说跟踪 365 天,这意味着我必须创建 365 个桶过滤器,这会使结果查询非常大。

【讨论】:

    【解决方案2】:

    我知道这个问题已经很老了,但由于它仍然是开放的,我正在分享我的知识。这个问题也没有清楚地解释期望什么样的输出,但我仍然认为这可以使用“日期直方图聚合”和“桶脚本聚合”来实现。

    这里是这两个聚合的文档链接。

    https://www.elastic.co/guide/en/elasticsearch/reference/5.5/search-aggregations-bucket-datehistogram-aggregation.html

    https://www.elastic.co/guide/en/elasticsearch/reference/5.5/search-aggregations-pipeline-bucket-script-aggregation.html

    【讨论】:

    • 请将您的链接内容摘要添加到您的答案中
    • 链接应该能够描述你的一切。如果您希望我围绕它提供一些示例查询,那么我需要预期的结果格式。
    猜你喜欢
    • 1970-01-01
    • 2016-11-19
    • 1970-01-01
    • 1970-01-01
    • 2018-11-28
    • 1970-01-01
    • 1970-01-01
    • 2014-12-29
    • 1970-01-01
    相关资源
    最近更新 更多