我在ES中有数据,如下所示:
'{"Emp_ID":"12212","Emp_Name":"Jim","Emp_Sal":300,"Dep_Id":22,"Dep_Name":"IT","Dep_Cnt":40}'
'{"Emp_ID":"6874590","Emp_Name":"Joe","Emp_Sal":140,"Dep_Id":66,"Dep_Name":"Admin","Dep_Cnt":20}'
'{"Emp_ID":"32135","Emp_Name":"Jill","Emp_Sal":170,"Dep_Id":66,"Dep_Name":"Admin","Dep_Cnt":20}'
'{"Emp_ID":"43312","Emp_Name":"Andy","Emp_Sal":450,"Dep_Id":22,"Dep_Name":"IT","Dep_Cnt":40}'
'{"Emp_ID":"315609","Emp_Name":"Cody","Emp_Sal":150,"Dep_Id":22,"Dep_Name":"IT","Dep_Cnt":40}'
'{"Emp_ID":"87346","Emp_Name":"Dave","Emp_Sal":500,"Dep_Id":55,"Dep_Name":"hr","Dep_Cnt":10}'
我希望获得Dep_Cnt订购的所有独特部门,我为此编写了以下查询
{
"size":0,
"aggs":{
"by_Dep_Cnt":{
"terms":{
"field":"Dep_Cnt",
"order":{
"_term":"asc"
}
},
"aggs":{
"by_unique_dep_id":{
"terms":{
"field":"Dep_Id"
},
"aggs":{
"tops":{
"top_hits":{
"size":1
}
}
}
}
}
}
}
}
得到了Dep_Cnt订购的3个独特部门的预期产量。 但现在我的要求是只获得前两个部门。 如何修改查询以仅获取2个桶?
答案 0 :(得分:0)
您要查找的是size
聚合的参数terms
:
如果 Dep_Cnt
是您所在部门的员工人数,而您的文档是每位员工,并且您的索引中包含所有员工(来自您的映射)情况可能就是这样;你可以这样做:
{
"size":0,
"aggs":{
"by_Dep_Id":{
"terms":{
"field":"Dep_Id",
"size": 2
}
}
}
因为默认情况下它将按具有相应值的文档数量排序,即具有此Dep_Id的文档数量,即该部门中的员工数量。
如果您不在这种情况下:
当你有两个相同大小的部门时,你当前的请求行为不一样(你会在同一个Dep_Id
桶中有两个Dep_Cnt
您可以按Dep_Id
对文档进行分组,使用您想要的指标(最小值,最大值,平均值,...)获取Dep_Cnt
并对此指标进行排序:
{
"size":0,
"aggs":{
"by_Dep_Id":{
"terms":{
"field":"Dep_Id",
"size": 2
"order":{
"avg_Dep_Cnt":"asc"
}
},
"aggs":{
"avg_Dep_Cnt":{
"avg":{
"field":"Dep_Cnt"
}
}
}
}
}
}
注意:我删除了top_hits聚合,因为你根据你的解释不需要它们,如果你有额外的要求只需要在聚合中添加它们。