Q:非洲食人族的酋长吃什么?

分组后获取指定的分组字段值的排名

Elasticsearch | 作者 YangLingQiang | 发布于2021年12月10日 | 阅读数:1034

这是我的数据源
[
{
"buyer_id_std" : 35444337,
"seller_id_std" : 3587575,
"date" : "2021-02-24T00:00:00"
},
{
"buyer_id_std" : 35444337,
"seller_id_std" : 75848633,
"date" : "2021-01-20T00:00:00"
},
{
"buyer_id_std" : 35444337,
"seller_id_std" : 25308769,
"date" : "2021-01-19T00:00:00"
},
{
"buyer_id_std" : 35444337,
"seller_id_std" : 25308769,
"date" : "2021-01-19T00:00:00"
},
{
"buyer_id_std" : 35444337,
"seller_id_std" : 74256954,
"date" : "2021-01-19T00:00:00"
},
{
"buyer_id_std" : 35444337,
"seller_id_std" : 65945090,
"date" : "2021-01-20T00:00:00"
},
{
"buyer_id_std" : 35444337,
"seller_id_std" : 74256954
"date" : "2021-01-19T00:00:00"
},
{
"buyer_id_std" : 35444337,
"seller_id_std" : 2374066,
"date" : "2021-01-20T00:00:00"
},
{
"buyer_id_std" : 35444337,
"seller_id_std" : 64505236,
"date" : "2021-01-19T00:00:00"
},
{
"buyer_id_std" : 35444337,
"seller_id_std" : 78976932,
"date" : "2021-01-19T00:00:00"
}
]
查询语句
GET trade/_search
{
"query": {
"bool": {
"filter": [
{
"term": {
"buyer_id_std": 35444337
}
},
{
"range": {
"date": {
"gte": "2020-09-06T00:00:00Z",
"lte": "2021-09-06T00:00:00Z"
}
}
}
]
}
},
"aggs": {
"group_by_stats": {
"terms": {
"field": "seller_id_std",
"size": 2000
}
}
},
"size": 0,
"track_total_hits": true
}
得到
"buckets" : [
{ "key" : 74256954, "doc_count" : 2},
{
"key" : 78976932,
"doc_count" : 1
},
{
"key" : 64505236,
"doc_count" : 1
}
]
现在需求是能获取指定 buyer_id_std 在桶中的位置(排名),并且获取排在他后面的N位(后面没有时获取前面) 比如:64505236 这个在样本数据中是第三名,那么我需要得到  这个第三名的数字,而且还要获取到前面2个(如果后面有第四,第五...则获取后面的),最终我需要的数据是:
 ps: 这只是样本数据, 生产数据buckets的长度最大可达10000
[
{
"companny_id" : 74256954,
"count" : 2,
"rank": 1
},
{
"companny_id" : 78976932,
"doc_count" : 1,
"rank": 2
},
{
"companny_id" : 64505236,
"count" : 1,
"rank": 3
}
]
在我的知识库中, 这样的是没法做到的。 需要自己写代码循环出来。但是有点不死心,也找了es官方文档,并没有得到支持。
所以前来问问各位大佬有没有解决方案
已邀请:

caster_QL

赞同来自:

默认terms分桶就是按文档数排序的,也就是doc_count,现在聚合返回的结果就是你想要的排名后的结果是嘛?
只是你想在每个桶内加上一个排名字段,从1往后排是嘛?

要回复问题请先登录注册