Combiner deux résultats d'aggregations et les diviser


(Joffrey Hercule) #1

Bonjour,

j'essaie depuis quelques temps de faire une moyenne. En gros sum(element1) / count(element2). Ceci via kibana.
Je suis tombé sur un article (https://github.com/elastic/kibana/issues/2504) qui semble dire (mon anglais n'est pas au top :wink: ) que ceci est impossible car elasticsearch ne le permet pas. Il faut faire les deux requêtes coté serveur et renvoyer la division dans un second temps.

Existe-t-il une alternative (par exemple avec un script) pour le faire en une requête ?


(David Pilato) #2

Tu ne peux pas faire une aggregation avg ?


(Joffrey Hercule) #3

Le soucis avec avg c'est que tu peux le faire uniquement sur un champs et
pas sur une combinaison de champs.
Par exemple, un document contient une "personne", un "nombre" et une
"date". Un avg me fera une moyenne du "nombre" par rapport à chaque
document et non par rapport à l'unique count de "personne" comme je
souhaiterais.

A moins que je me trompe et qu'il est possible de faire ce type de requête !

Cordialement,
Joffrey Hercule


(David Pilato) #4

Si tu fais un premier niveau de agg sur personne puis un av. sur nombre, tu auras par personne la moyenne de nombre.

Ou je ne comprends pas et un exemple serait le bienvenu. :slight_smile:


(Joffrey Hercule) #5

Si si tu as bien compris :slight_smile:
Tu peux faire ça :
"aggs": {
"group_by": {
"terms": {
"field": "personne"
},
"aggs": {
"moyenne": {
"avg": {
"field": "nombre"
}
}
}
}

mais pas ça :
"aggs": {
"group_by": {
"cardinality": {
"field": "personne"
},
"aggs": {
"moyenne": {
"avg": {
"field": "nombre"
}
}
}
}

comme cardinality est experimental, ça ne doit pas être intégré à elastic... Pour le moment cela renvoit uniquement le unique count, sans la moyenne.


(system) #6