elasticsearch—按弹性索引上的点击数对聚合进行分页

3lxsmp7m  于 2021-06-10  发布在  ElasticSearch
关注(0)|答案(1)|浏览(351)

我有一个弹性指数 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 值),但它不是按下载次数排序的,而是按文件名排序的。
如何根据索引中每个文件名的文档数对复合聚合进行排序?
谢谢。

3mpgtkmj

3mpgtkmj1#

复合聚合不允许基于值字段进行排序。
弹性论坛讨论节选:
它被设计成一种对内存友好的方式来对聚合进行分页。这种折衷的一部分是,您丢失了按doc count排序之类的内容,因为在收集完所有文档之后才知道这一点。
我没有转换(x-pack的一部分和许可证)的经验,但你可以尝试一下。除此之外,我看不到一种方法来获得预期的输出。

相关问题