Aggrégaration: avoir un champ suplémentaire!


#1

Bonjour,
je veux faire une requête d'aggrégation et avoir un champs suplémentaire dans le résultat, je donne un exemple pour que ce soit un peu plus claire.
en gros j'ai des données dans ES comme ça :

[
{
  "id_object": "object:1",
  "count": 3,
  "action": {
    "id": "action:1",
    "name": "Faire acetion 1"
  }
}
....
]

la requête que je fais:

{
  "aggs": {
    "specific_element": {
      "aggs": {
        "bucket": {
          "aggs": {
            "result": {
              "sum": {
                "field": "count"
              }
            }
          },
          "terms": {
            "order": {
              "result": "desc"
            },
            "field": "action.id"
          }
        }
      },
      "filter": {
        "term": {
          "id_job": "object:1"
        }
      }
    }
  }
}

le résultat de cette recherche:

{
  "hits": {
    "hits": [
      {
        "_index": "index_name",
        "_id": "KiK9KmMBWhk4qB402bF3",
        "_score": 1,
        "_source": {
          "count": 1,
          "id_object": "object:1",
          "action": {
            "id": "action:1",
            "name": "Faire acetion 1"
          }
        }
      },
      {
        "_index": "index_name",
        "_id": "KyK9KmMBWhk4qB402bF3",
        "_score": 1,
        "_source": {
          "count": 5,
          "id_object": "object:2",
          "action": {
            "id": "action:2",
            "name": "Faire acetion 2"
          }
        }
      }
    ]
  },
  "aggregations": {
    "specific_element": {
      "doc_count": 15,
      "bucket": {
        "doc_count_error_upper_bound": 0,
        "sum_other_doc_count": 5,
        "buckets": [
          {
            "key": "action:100",
            "doc_count": 1,
            "result": {
              "value": 28
            }
          },
          {
            "key": "action:102",
            "doc_count": 1,
            "result": {
              "value": 4
            }
          },
          {
            "key": "action:105",
            "doc_count": 1,
            "result": {
              "value": 35
            }
          }
        ]
      },
      "total_count": {
        "value": 182
      }
    }
  }
}

ce que je veux avoir en plus dans ce résultat, je ne sais pas si possible, d'avoir les noms des actions: action:100, action:102 et action:105

Merci pour les réponses par avance.


(David Pilato) #2

Tu peux sans doute faire une sous aggregation de type terms sur le champ action.name.keyword (si tu indexes dans un sous champ .keyword ton texte d'origine).


#3

Bonjour David,
merci pour votre réponse.
pas d'autre moyen, je ne veux pas faire une agrégation sur le nom.
je veux juste avoir l'objet "action" en réponse.
peut-être que je n'ai pas le choix :slight_smile:
merci


(Gabriel Tessier) #4

Bonjour,

Juste en passant surveille ta memoire (heap) avec les données sur ton serveur de prod j'ai déja planté un serveur en faisant des sous-sous aggregations... une autre solution si tu veux recuperer plus de champs et ne pas faire 15 sous sous aggregations c'est d'en faire une, puis recuperer ton id et refaire une requete pour recuperer tous les champs dont t'as besoin.
Je ne sais pas si c'est clair, mais en gros faire 2 requetes rapides valent mieux qu'en faire une grosse lente.


#5

Bonjour,
merci pour les réponses, j'ai fais autrement, voici la nouvelle requête:

{
  "query": {
    "match": {
      "id_job": "object:1"
    }
  },
  "aggs": {
    "result": {
      "terms": {
        "field": "action.id"
      },
      "aggs": {
        "count": {
          "sum": {
            "field": "count"
          }
        }
      }
    }
  }
}

ça l'air de bien fonctionner


#6

ne marche pas non plus :frowning:


(David Pilato) #7

Tu peux expliquer la différence entre:

ça l'air de bien fonctionner

Et

ne marche pas non plus :frowning:


#8

non mais ça ne fonctionne pas puisque j'avais le test avec peu de données "action", moins de 10 éléments.

Dès que je dépase 10 actions ça ne fonctionne plus puisque es ne retourne que les 10 prmiers, dans la prtie aggrégation on peut avoir une action qui n'est pas dans hits


(David Pilato) #9

Dès que je dépase 10 actions ça ne fonctionne plus puisque es ne retourne que les 10 prmiers, dans la prtie aggrégation on peut avoir une action qui n'est pas dans hits

Et ? Du coup quel est le problème avec ça ?
Je veux dire que quand je calcule des aggrégations, je mets souvent size: 0.


#10

Bonjour,

le problème n'est pas dans la partie aggrégation mais dans la partie hits, je n'ai pas toutes les actions dans hits qui sont aggrégés.
peut-être que je m'explique mal !


(David Pilato) #11

En tout cas je ne comprends pas.

L'idéal serait d'écrire un exemple simple et concret qu'on puisse copier coller dans Kibana et rejouer.


(system) #12

This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.