Children aggregation totalement fausse


(Kaliseo) #1

Bonjour à tous,

J'essaie de monter des requêtes relativement complexes sous ElasticSearch et de récupérer des aggregations a partir de ces dernières.

Autant le doc_count des aggregations est bon, autant les buckets sont complètement faux.

Voici ma requête :

{
    "query": {
        "has_child": {
            "type": "transaction",
            "query": {
                "bool": {
                    "must": [
                        {
                            "term": {
                                "transaction.products.pid": "66130766378"
                            }
                        },
                        {
                            "range": {
                                "transaction.date": {
                                    "gt": "now-14d"
                                }
                            }
                        }
                    ],
                    "must_not": []
                }
            }
        }
    },
    "aggs": {
        "most_bought": {
            "children": {
                "type": "transaction"
            },
            "aggs": {
                "productFilter": {
                    "filter": {},
                    "aggs": {
                        "products": {
                            "terms": {
                                "field": "transaction.products.pid"
                            }
                        }
                    }
                }
            }
        }
    }
}

En gros, je demande, pour les utilisateurs qui ont acheté ce produit (has_child), quels sont les produits achetés (aggs).

Voici le résultat que j'obtiens :

{
   "took":2,
   "timed_out":false,
   "_shards":{
      "total":5,
      "successful":5,
      "failed":0
   },
   "hits":{
      "total":5,
      "max_score":1,
      "hits":[
         {
            "_index":"twiga_v4",
            "_type":"user",
            "_id":"AU2aCDIqmTOfL8aT6oxI",
            "_score":1,
            "_source":{
               "cookies":[
                  "1432808336328698032885"
               ],
               "localuid":[

               ],
               "iplocation":[

               ],
               "date":"2015-05-28T10:19:14.637Z"
            }
         },
         {
            "_index":"twiga_v4",
            "_type":"user",
            "_id":"AU2aB5mbmTOfL8aT6ow2",
            "_score":1,
            "_source":{
               "cookies":[
                  "1432808296854342757903"
               ],
               "localuid":[

               ],
               "iplocation":[

               ],
               "date":"2015-05-28T10:18:45.792Z"
            }
         },
         {
            "_index":"twiga_v4",
            "_type":"user",
            "_id":"AU2aCbwamTOfL8aT6oxu",
            "_score":1,
            "_source":{
               "cookies":[
                  "1432808436584201734440"
               ],
               "localuid":[

               ],
               "iplocation":[

               ],
               "date":"2015-05-28T12:18:14.882Z"
            }
         },
         {
            "_index":"twiga_v4",
            "_type":"user",
            "_id":"AU2adbIVmTOfL8aT6pMD",
            "_score":1,
            "_source":{
               "cookies":[
                  "1432815512824511789572"
               ],
               "localuid":[

               ],
               "iplocation":[

               ],
               "date":"2015-05-28T12:19:28.764Z"
            }
         },
         {
            "_index":"twiga_v4",
            "_type":"user",
            "_id":"AU2aeluBmTOfL8aT6pNu",
            "_score":1,
            "_source":{
               "cookies":[
                  "1432815818378397089816"
               ],
               "localuid":[

               ],
               "iplocation":[

               ],
               "date":"2015-05-28T12:46:32.948Z"
            }
         }
      ]
   },
   "aggregations":{
      "most_bought":{
         "doc_count":5,
         "productFilter":{
            "doc_count":5,
            "products":{
               "doc_count_error_upper_bound":0,
               "sum_other_doc_count":0,
               "buckets":[
                  {
                     "key":"24143302320",
                     "doc_count":1
                  },
                  {
                     "key":"66130766378",
                     "doc_count":1
                  }
               ]
            }
         }
      }
   }
}

ElasticSearch me retourne 2 buckets (ils devrait y en avoit beaucoup plus), avec seulement 1 résultat pour chaque, alors que l'ID 66130766378 est présent 5 fois dans les types transactions. D'ailleurs, le comptage fait au niveau de l'aggregation productFilter est correct !

Quelqu'un a un retour d'expérience sur le sujet ?

En vous remerciant par avance.


(Kaliseo) #2

J'ai trouvé une solution pour le moment, un peu tordue certes, mais qui fonctionne.

Au lieu d'utiliser Children Aggregation qui visiblement ne fonctionne pas très bien, j'ai appelé directement le type transaction en demandant, les parents des enfants qui contiennent tel ID produit :

{
    "query": {
        "has_parent": {
            "parent_type": "user",
            "query": {
                "has_child": {
                    "type": "transaction",
                    "query": {
                        "bool": {
                            "must": [
                                {
                                    "term": {
                                        "transaction.products.pid": "66130766378"
                                    }
                                },
                                {
                                    "range": {
                                        "transaction.date": {
                                            "gt": "now-14d"
                                        }
                                    }
                                }
                            ],
                            "must_not": []
                        }
                    }
                }
            }
        }
    },
    "aggs": {
        "products": {
            "terms": {
                "field": "transaction.products.pid"
            }
        }
    }
}

De cette manière, j'obtiens bien le résultat escompté :

{
   "took":1,
   "timed_out":false,
   "_shards":{
      "total":5,
      "successful":5,
      "failed":0
   },
   "hits":{
      "total":5,
      "max_score":1,
      "hits":[

      ]
   },
   "aggregations":{
      "products":{
         "doc_count_error_upper_bound":0,
         "sum_other_doc_count":0,
         "buckets":[
            {
               "key":"66130766378",
               "doc_count":5
            },
            {
               "key":"24143302320",
               "doc_count":2
            },
            {
               "key":"16279259401",
               "doc_count":1
            },
            {
               "key":"22681937401",
               "doc_count":1
            },
            {
               "key":"2441925385",
               "doc_count":1
            },
            {
               "key":"24732205320",
               "doc_count":1
            },
            {
               "key":"25071098119",
               "doc_count":1
            }
         ]
      }
   }
}

Si ça peut aider quelqu'un qui est dans la même galère...


(system) #3