2017-01-10 2 views
1

I-Daten in ES haben, die wie folgt aussieht:Elasticsearch - Aggregation und Bucket Größe

'{"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}'  

ich von Dep_Cnt bestellt alle möchten die einzigartige Abteilungen, für die ich die folgende Abfrage geschrieben

{ 
    "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 
        } 
        } 
       } 
      } 
     } 
     } 
    } 
} 

Und erwartete Ausgabe von 3 einzigartigen Abteilungen von Dep_Cnt bestellt. Aber jetzt ist meine Anforderung, nur die oberen zwei Abteilungen zu bekommen. Wie ändere ich die Abfrage, um nur 2 Buckets zu erhalten?

Antwort

0

Was Sie suchen ist der Parameter size der terms Aggregation:

WennDep_Cnt die Zahl der Mitarbeiter in Ihrer Abteilung und Ihr Dokument sind pro Mitarbeiter und Sie haben alle Mitarbeiter in Ihrer Index (von Ihrem Mapping kann es der Fall sein), können Sie einfach tun:

{ 
    "size":0, 
    "aggs":{ 
     "by_Dep_Id":{ 
     "terms":{ 
      "field":"Dep_Id", 
      "size": 2 
     } 
    } 
} 

Da wird standardmäßig durch die Anzahl der Dokumente mit dem entsprechenden Wert dh sortieren die Anzahl der Dokumente mit dieser Dep_Id, d. h. die Anzahl der Mitarbeiter in dieser Abteilung.

Wenn Sie nicht in dieser Situation sind:

Ihre aktuelle Anfrage nicht die gleiche Art und Weise verhalten, wenn Sie zwei Abteilung mit der gleichen Größe haben (Sie müssen zwei Dep_Id s in dem gleichen Eimer Dep_Cnt)

können Sie Gruppendokumente von Dep_Id, erhalten die Dep_Cnt die Metrik verwenden Sie (min, max, avg, ...) und Art auf dieser Metrik:

{ 
    "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" 
       } 
      } 
     } 
     } 
    } 
} 

NB: Ich habe die top_hits-Aggregationen entfernt, da Sie sie nicht benötigen, wie Sie es beschrieben haben. Wenn Sie zusätzliche Anforderungen haben, fügen Sie sie einfach in die Aggregation ein.

Verwandte Themen