我有一个弹性指数 file
)每次客户端下载文件时,我都会附加一个文档。每个文档都非常基本,它包含一个字段 filename
以及表示下载时间的日期。
我想实现的是,得到每个文件在过去3个月内被下载的次数。多亏了另一个问题,我得到了一个返回所有结果的查询:
{
"query": {
"range": {
"when": {
"gte": "now-3M"
}
}
},
"aggs": {
"downloads": {
"terms": {
"field": "filename.keyword",
"size": 1000
}
}
},
"size": 0
}
现在,我想要一个分页的结果。术语aggregation不能分页,因此我使用复合聚合。当然,如果有更好的聚合,可以在这里使用。。。
所以现在,我有这样的想法:
{
"query": {
"range": {
"when": {
"gte": "now-3M"
}
}
},
"aggs": {
"downloads_agg": {
"composite": {
"size": 100,
"sources": [
{
"downloads": {
"terms": {
"field": "filename.keyword"
}
}
}
]
}
}
},
"size": 0
}
这个聚合允许我分页(感谢 after_key
值),但它不是按下载次数排序的,而是按文件名排序的。
如何根据索引中每个文件名的文档数对复合聚合进行排序?
谢谢。
1条答案
按热度按时间3mpgtkmj1#
复合聚合不允许基于值字段进行排序。
弹性论坛讨论节选:
它被设计成一种对内存友好的方式来对聚合进行分页。这种折衷的一部分是,您丢失了按doc count排序之类的内容,因为在收集完所有文档之后才知道这一点。
我没有转换(x-pack的一部分和许可证)的经验,但你可以尝试一下。除此之外,我看不到一种方法来获得预期的输出。