在某个索引文档中有一个关键字,一个等级和一个时间戳。关键字的排名可能会不时发生变化。这意味着数据集可能如下所示:
{"keywords": "piano", "rank" 1, "timestamp": 1437642812}
{"keywords": "piano", "rank" 2, "timestamp": 1437642813}
{"keywords": "electric guitar", "rank" 5, "timestamp": 1437644326}
我想获得前500个最常出现的关键字的平均排名。但我无法知道如何做到这一点。
我目前的尝试似乎总是单独给出结果的平均值,但我想得到整个数据集的平均值,只有聚合的最高结果。
POST _search
{
"aggs": {
"top_keywords": {
"terms": {
"field": "keywords",
"size": 1
}
},
"avg_rank": {
"avg": {"field": "rank"}
}
},
"size": 0
}
尝试使用top_hits也没有成功。
在其他地方,我已经阅读过将查询拆分为单独的查询,首先检索顶级关键字列表,然后在第二个查询中按照第一个查询返回的关键字过滤文档。我想将查询提供给Kibana,所以我希望这不是必需的。
这些相关主题也不能提供令人满意的答案。
有人能指出我正确的方向吗?
答案 0 :(得分:1)
ElasticsSearch开发人员告诉我目前无法实现:
在当前版本中,这是不可能的,但是使用版本2.0中的管道聚合,您将能够使用avg_bucket聚合来执行此操作:https://www.elastic.co/guide/en/elasticsearch/reference/master/search-aggregations-pipeline-avg-bucket-aggregation.html
与此同时,您需要对前500个术语进行聚合并在客户端执行平均计算
这使得目前无法在Kibana中显示这些数据:
是的,这可以在2.0中直接用于Elasticsearch的请求。但是,将功能添加到Kibana界面需要一些时间。 Kibana团队正在思考如何添加
来源:https://discuss.elastic.co/t/average-of-top-n-terms/26165