【发布时间】:2020-10-08 11:08:23
【问题描述】:
我有一个仅附加的索引。每个更改都与日期属性一起保存为新文档。为了获取当前的活动数据,我需要按 ID 对所有实体进行分组,并获取日期最新的实体。应该可以为该日期添加过滤器。我一直在玩聚合,但我被滚动 API 卡住了。
数据示例(注意:id 是 guid,日期是 unix 时间戳,这里使用其他值更清楚)
{"id": "<entityId_date>", "entityId", 1, "date": "2020-05-10", "value": { <JSON document> } },
{"id": "<entityId_date>", "entityId", 1, "date": "2020-06-10", "value": { <JSON document> } },
{"id": "<entityId_date>", "entityId", 2, "date": "2020-04-10", "value": { <JSON document> } },
{"id": "<entityId_date>", "entityId", 2, "date": "2020-08-10", "value": { <JSON document> } },
{"id": "<entityId_date>", "entityId", 3, "date": "2020-07-10", "value": { <JSON document> } }
要求的结果:
{"id": "<entityId_date>", "entityId", 1, "date": "2020-06-10", "value": { <JSON document> } },
{"id": "<entityId_date>", "entityId", 2, "date": "2020-08-10", "value": { <JSON document> } },
{"id": "<entityId_date>", "entityId", 3, "date": "2020-07-10", "value": { <JSON document> } }
尝试了以下查询:
{
"size": 0,
"aggs": {
"id_aggregate": {
"terms": {
"field": "entityId"
},
"aggs": {
"date_aggregate": {
"top_hits": {
"sort": [{
"date.ticks": {
"order": "desc"
}
}],
"size": 1
}
}
}
}
}
}
我得到的结果是正确的,但我只得到了前 X 个结果。我可以设置id_aggregate 的大小,但可能有数千个文档。
使用普通的搜索查询,我可以使用 Scroll API,但对于聚合,这是不可能的。
我研究过使用分区,但这对我也没有帮助,因为有时文档很少,有时会加载很多。 (这是一种基本查询,我们执行的所有其他查询都将指定额外的过滤器)。
如何构建一个按最大日期获取文档且可滚动的查询?
【问题讨论】:
标签: elasticsearch elasticsearch-aggregation