Elasticsearch - 聚合和存储桶大小

时间:2017-01-10 21:07:33

标签: elasticsearch aggregate

我在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个桶?

1 个答案:

答案 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聚合,因为你根据你的解释不需要它们,如果你有额外的要求只需要在聚合中添加它们。