2016-07-22 1 views
0

Je travaille pour trouver le moyen de faire des agrégations sur un champ après filtrage sur un autre classé. Mais, la documentation de recherche élastique n'est pas facilement compréhensible.Agrégation sur un champ et retour de la somme dans elasticsearch

Disons que mon Mapping:

[ 
    { 
    a:'a1' 
    b:'b1' 
    c:120 
    d:12 
    }, 
    { 
    a:'a2' 
    b:'b1' 
    c:170 
    d:15 
    } 
    { 
    a:'a3' 
    b:'b2' 
    c:128 
    d:18 
    } 
    { 
    a:'a4' 
    b:'b1' 
    c:158 
    d:5 
    } 
] 

agrégation requise:

Return the sum of field "c", by selecting the docs with "b" where b=b1 and d is less than 13 

Ce n'est pas mon exigence, mais la réponse me aide à comprendre la documentation.

Répondre

1

Essayez ceci:

POST index/_search 
{ 
    "query": { 
    "bool": { 
     "must": [ 
     { 
      "term": { 
      "b": "b1" 
      } 
     }, 
     { 
      "range": { 
      "d": { 
       "lt": 13 
      } 
      } 
     } 
     ] 
    } 
    }, 
    "aggs": { 
    "total": { 
     "sum": { 
     "field": "c" 
     } 
    } 
    } 
} 
+0

Les agrégations se produisent sur l'ensemble des documents, mais je voulais la somme de champ « c » pour les documents sélectionnés avec terme « b » et « d » –

+0

C'est ce que ce qui précède fait. La requête sélectionne uniquement les documents dont les champs 'b' et' d' correspondent à leurs requêtes respectives et les agrégations ne seront exécutées que sur ces documents. Essaye le. – Val

+0

{ "aggs": { "total": { "somme": { "champ": "c" }} } ....... aussi retourner la même valeur que la requête ci-dessus. Je suis incapable de comprendre le filtrage ici. –