2017-04-20 1 views
2

J'ai un problème avec l'agrégation imbriquée dans Elasticsearch. J'ai la cartographie avec le champ imbriqué:Elasticsearch. Agrégation de termes sur un champ imbriqué avec des valeurs dupliquées

POST my_index/ my_type/_mapping 
{ 
    "properties": { 
     "name": { 
      "type": "keyword" 
     }, 
     "nested_fields": { 
      "type": "nested", 
       "properties": { 
       "key": { 
        "type": "keyword" 
       }, 
       "value": { 
        "type": "keyword" 
       } 
      } 
     } 
    } 
} 

Puis-je ajouter un document à l'index:

POST my_index/ my_type 
{ 
    "name":"object1", 
     "nested_fields":[ 
      { 
       "key": "key1", 
       "value": "value1" 

      }, 
      { 
       "key": "key1", 
       "value": "value2" 
      } 
     ] 
} 

Comme vous le voyez, dans mon tableau imbriqué j'ai deux éléments, qui ont la même domaine key, mais différent value champ. Ensuite, je veux faire une telle requête:

GET/my_index/my_type/_search 
{ 
    "query": { 
     "nested": { 
      "path": "nested_fields", 
       "query": { 
       "bool": { 
        "must": [ 
         { 
          "term": { 
           "nested_fields.key": { 
            "value": "key1" 
           } 
          } 
         }, 
         { 
          "terms": { 
           "nested_fields.value": [ 
            "value1", 
            "value2" 
           ] 
          } 
         } 
        ] 
       } 
      } 
     } 
    }, 
    "aggs": { 
     "agg_nested_fields": { 
      "nested": { 
       "path": "nested_fields" 
      }, 
      "aggs": { 
       "agg_nested_fields_key": { 
        "terms": { 
         "field": "nested_fields.key", 
          "size": 10 
        } 
       } 
      } 
     } 
    } 
} 

Comme vous le voyez, je veux trouver tous les documents qui ont au moins un objet dans le tableau nested_field, avec key propriété égale à key1 et l'une des valeurs fournies (value1 ou value2). Ensuite, je veux regrouper les documents fondés par nested_fields.key. Mais j'ai une telle réponse

{ 
    "took": 13, 
     "timed_out": false, 
      "_shards": { 
     "total": 5, 
      "successful": 5, 
       "failed": 0 
    }, 
    "hits": { 
     "total": 1, 
      "max_score": 0.87546873, 
       "hits": [ 
        { 
         "_index": "my_index", 
         "_type": "my_type", 
         "_id": "AVuLNXxiryKmA7VEwOfV", 
         "_score": 0.87546873, 
         "_source": { 
          "name": "object1", 
          "nested_fields": [ 
           { 
            "key": "key1", 
            "value": "value1" 
           }, 
           { 
            "key": "key1", 
            "value": "value2" 
           } 
          ] 
         } 
        } 
       ] 
    }, 
    "aggregations": { 
     "agg_nested_fields": { 
      "doc_count": 2, 
       "agg_nested_fields_key": { 
       "doc_count_error_upper_bound": 0, 
        "sum_other_doc_count": 0, 
         "buckets": [ 
          { 
           "key": "key1", 
           "doc_count": 2 
          } 
         ] 
      } 
     } 
    } 
} 

Comme vous le voyez de la réponse, j'ai un coup (il est correct), mais le document a été compté deux fois dans l'agrégation (voir doc_count: 2), parce qu'il a deux éléments avec ' key1 'valeur dans nested_fields tableau. Comment puis-je obtenir le bon nombre d'agrégation?

+0

C'est le nombre exact, puisque chaque élément imbriqué est un document dans son propre droit. Donc, vous avez vraiment deux documents imbriqués qui ont la clé key1 comme valeur et la valeur value1 ou value2 comme valeur. – Val

+0

Oui j'ai besoin de ça. Comment puis-je surmonter ce problème? – Stalso

+0

cela aide-t-il https://stackoverflow.com/a/27578607/7379424? –

Répondre

0

Vous devrez utiliser reverse_nested aggs dans l'agrégation imbriquée pour renvoyer le nombre d'agrégations sur le document racine.

{ 
    "query": { 
     "nested": { 
      "path": "nested_fields", 
      "query": { 
       "bool": { 
        "must": [{ 
          "term": { 
           "nested_fields.key": { 
            "value": "key1" 
           } 
          } 
         }, 
         { 
          "terms": { 
           "nested_fields.value": [ 
            "value1", 
            "value2" 
           ] 
          } 
         } 
        ] 
       } 
      } 
     } 
    }, 
    "aggs": { 
     "agg_nested_fields": { 
      "nested": { 
       "path": "nested_fields" 
      }, 
      "aggs": { 
       "agg_nested_fields_key": { 
        "terms": { 
         "field": "nested_fields.key", 
         "size": 10 
        }, 
        "aggs": { 
         "back_to_root": { 
          "reverse_nested": { 
           "path": "_source" 
          } 
         } 
        } 
       } 
      } 
     } 
    } 
} 
+0

Il est également incorrect. – Stalso

+0

comment, vous voulez le nombre de parent/doc racine. ok je comprends jusqu'ici 'Comme vous voyez de la réponse, j'ai un coup (c'est correct), mais le document a été compté deux fois dans l'agrégation (voir doc_count: 2), parce qu'il a deux éléments avec la valeur' ​​key1 'dans tableau nested_fields. Comment puis-je obtenir le bon compte en agrégation? vous avez ajouter plus d'informations que vous voulez réaliser – user3775217