我有一个只附加的索引。每次更改都会与日期属性一起保存为新文档。为了获取当前的活动数据,我需要按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
,但可能有成千上万的文件。对于一个普通的搜索查询,我可以使用scrollapi,但是这在聚合中是不可能的。
我已经研究过如何使用分区,但这对我也没有帮助,因为有时文档很少,有时会有负载(这是一种基本查询,我们执行的所有其他查询都将指定其他筛选器)。
我如何构建一个查询来获取文档的最长日期和滚动?
1条答案
按热度按时间6jjcrrmo1#
可以使用复合aggs分页并保留
top_hits
agg仅检索最近的文档: