Elasticsearch 查询 - 如何聚合时间戳并按术语过滤?

Elasticsearch Query - How to aggregate timestamps and filter by term?

我有一个有效的过滤器查询:

{
  "filter": {
    "and": [{
      "range": {
        "timestamp": {
          "gte": "2015-05-07T12:04:30Z"
          "lte": "2015-08-07T12:04:30Z"
        }
      }
    }, {
      "term": {
        "in_context.course_id": "1234567"
      }
    }]
  },
  "fields": ["timestamp"]
}

其中 returns 最近三个月每个事件的时间戳。 但是返回了大约 100 万个时间戳,这使得响应太大,所以我想汇总结果并获得每天的文档总和。

我发现这个使用日期直方图的片段:

{
    "aggs" : {
        "histo1" : {
            "date_histogram" : {
                "field" : "timestamp",
                "interval" : "day"
            },
            "aggs" : {
                "price_stats" : {
                    "stats" : {
                        "field" : "price"
                    }
                }
            }
        }
    }
}

这正是我所需要的,但我不知道如何将它合并到我的原始查询中,并使用术语过滤器!非常乐意提供帮助!

您只需在查询的顶层添加 aggs 部分即可。请注意,我将您的 filter 包装到 filtered 查询中。

{
  "size": 0,
  "query": {
    "filtered": {
      "filter": {
        "and": [
          {
            "range": {
              "timestamp": {
                "gte": "2015-05-07T12:04:30Z",
                "lte": "2015-08-07T12:04:30Z"
              }
            }
          },
          {
            "term": {
              "in_context.course_id": "1234567"
            }
          }
        ]
      }
    }
  },
  "aggs": {
    "histo1": {
      "date_histogram": {
        "field": "timestamp",
        "interval": "day"
      }
    }
  }
}