/ / ElasticSearch - Aggregationen: Filtern und Sortieren von Buckets - json, elasticsearch

ElasticSearch - Aggregationen: Filtern und Sortieren von Buckets - json, elasticsearch

Verwenden von ElasticSearch 5.2

Als Beispiel werde ich eine Datenbank verwenden, die alle Menschen auf der Welt repräsentiert.

Beispielanfrage: Erhalten Sie das Durchschnittsgehalt einer Person, gruppiert nach Land, für alle älter als 30 Jahre alt. (Antwort sollte die Top 10 Länder mit ihrem durchschnittlichen Gehalt enthalten)

Schritte, die ich zum Erstellen meiner Aggregationsabfrage ausgeführt habe:

  1. Filtern Sie den Rohdatensatz (filter: age > 30)
  2. Aggregat auf "country"
  3. Verwenden Sie den metrischen Avg-Wert im Feld "salary"

Das Problem, dem ich gegenüberstehe, ist, dass ich entweder einen Filter anwenden kann, bevor ich aggregiere, oder die Eimer sortiere, aber es scheint, als ob ES mir nicht erlaubt beides zu tun.
Mit anderen Worten: Ich kann meine "order"Abfrage"myInnerAggregation"weil es vorangestellt ist"myFilterAggregation"

GET myIndex/_search
{
"size":0,
"aggs": {
"myAggregation": {
"terms": {
"size":10,
"field": "country",
"order": [
{
"myInnerAggregation": "desc"
// I cannot specify "myInnerAggregation" here, only
// "myFilterAggregation" (because it"s out of scope I guess)
}
]
},
"aggs": {
"myFilterAggregation": {
"filter": { /* age > 30 (filter syntax is not the problem)*/},
"aggs": {
"myInnerAggergation": {
"avg": {
"field": "salary"
}
}
}
}
}
}

} }

Ich habe gesehen, dass ES 6.1+ Unterstützung für "bucket_sort", was wahrscheinlich dieses Problem lösen würde, aber ich kann nicht glauben, dass eine einfache Aggregation wie diese von ES 5.2 nicht behandelt werden kann?

Antworten:

0 für die Antwort № 1

Dies sollte den Trick machen:

"order": [
{
"MyFilterAggregation>MyInnerAggregation": "desc"
}
]

0 für die Antwort № 2

Versuchen Sie, den Filter auf die query Teil der Anfrage. Sie müssen Ihren Filter nicht als Aggregation deklarieren, Aggregationen respektieren Filter, die in der query Teil Ihrer Anfrage. Hoffentlich können Sie auf diese Weise Ihr Problem umgehen.