elasticsearch 按 ID 字段分组并在日期字段上执行最大值

elasticsearch group by ID field and perform max on date field

我的索引有如下所述的数据。

Id    version_number groupId   indexDate
1    v1                 1    2016-11-15T12:00:00
2    v1                 2    2016-11-20T12:00:00
3    v2                 2    2016-12-01T12:00:00
4    v1                 3    2016-13-01T12:00:00
5    v1                 4    2016-11-01T12:00:00
6    v2                 4    2016-13-01T12:00:00
7    v1                 5    2016-14-01T12:00:00

如何在 java 中编写 elasticsearch 查询。如果我按日期 2016-13-01T12:00:00 搜索,我希望看到每个 groupId 的最新版本,其中 indexDate 小于或等于搜索的日期?

预期输出:

Id    version_number   groupId   indexDate
1    v1                  1       2016-13-01T12:00:00
2    v2                  2       2016-11-20T12:00:00
6    v3                  3       2016-10-01T12:00:00
7    v2                  4       2016-10-01T12:00:00 

我没有在 elasticsearch 的日期字段上看到 max 函数来实现这个。

我会先在 version_number 上进行聚合,然后使用 top_hits 子聚合按 indexDate 降序排序并返回该存储桶的第一个文档的 ID。

{
  "size": 0,
  "aggs": {
    "by_version": {
      "terms": {
        "field": "version_number"
      },
      "aggs": {
        "max_date": {
          "top_hits": {
            "size": 1,
            "sort": {
              "indexDate": "desc"
            },
            "_source": [
              "id"
            ]
          }
        }
      }
    }
  }
}