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"
]
}
}
}
}
}
}
我的索引有如下所述的数据。
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"
]
}
}
}
}
}
}