Elasticsearch平均日期直方图桶

Thi*_*t J 6 facets elasticsearch date-histogram

我在ElasticSearch中有一堆索引的文档,我需要获取以下数据:

对于每个月,获取当月每个工作日的平均文档(或者如果不可能,则使用20天作为默认值).

我已经使用聚合将我的数据汇总到了几个桶中date histogram.我尝试嵌套stats存储桶,但此聚合使用从文档字段中提取的数据,而不是从父存储桶中提取的数据.

这是我目前的查询:

{
    "query": {
        "match_all": {}
    },
    "aggs": {
        "docs_per_month": {
            "date_histogram": {
                "field": "created_date",
                "interval": "month",
                "min_doc_count": 0
            }
            "aggs": {
                '???': '???'
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑

为了使我的问题更清楚,我需要的是:

  • 获取为该月创建的文档总数(由于date_histogram聚合已经完成)
  • 获取当月的工作日数
  • 将第一个除以第二个.

小智 9

对于仍然感兴趣的任何人,您现在可以使用avg_bucket聚合。它仍然有点棘手,因为您不能简单地avg_bucketdate_historgram聚合结果上运行,而是使用value_count具有某些唯一值的辅助聚合并且它工作正常:)

{
  "size": 0,
  "aggs": {
    "orders_per_day": {
      "date_histogram": {
        "field": "orderedDate",
        "interval": "day"
      },
      "aggs": {
        "amount": {
          "value_count": {
            "field": "dateCreated"
          }
        }
      }
    },
    "avg_daily_order": {
      "avg_bucket": {
        "buckets_path": "orders_per_day>amount"
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)


And*_*fan 2

您基本上需要的是这样的东西(这不起作用,因为它不是可用的功能):

{
  "query": {
    "match_all": {}
  },
  "aggs": {
    "docs_per_month": {
      "date_histogram": {
        "field": "date",
        "interval": "month",
        "min_doc_count": 0
      },
      "aggs": {
        "average": {
          "avg": {
            "script": "doc_count / 20"
          }
        }
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

它不起作用,因为无法doc_count从“父”聚合访问。

但是,这在 Elasticsearch 的 2.x 分支中是可能的,目前正在积极开发中: https: //github.com/elastic/elasticsearch/issues/8110 这个新功能将添加第二层操作聚合的结果(桶),它不仅是您的用例,而且是许多其他用例。

除非您想尝试一些想法或在应用程序中执行自己的计算,否则您需要等待此功能。