2017-06-14 1 views
0

Je suis nouveau sur Elasticsearch et je n'arrive pas à résoudre le problème suivant. La façon la plus simple d'expliquer mon problème est de vous montrer un exemple. Le tableau suivant "list" fait partie de tous mes fichiers dans Elasticsearch, mais les entrées varient, donc la "personne" avec le "id" 42, pourrait être dans 50% de mes fichiers. Ce que j'essaye de faire est d'obtenir la moyenne "ranking.position.standard" de toutes les personnes avec l'identification 42 dans tous mes dossiers dans Elasticsearch.Agrégation Elasticsearch uniquement sur des entrées spécifiques dans un tableau

{ 
"listing": [ 
    { 
     "person": { 
      "id": 42 
     }, 
     "ranking": { 
      "position": { 
       "standard": 2 
      } 
     } 
    }, 
    { 
     "person": { 
      "id": 55 
     }, 
     "ranking": { 
      "position": { 
       "standard": 7 
      } 
     } 
    } 
] 
} 

Merci pour votre aide!

+0

Qu'avez-vous essayé jusqu'à présent? –

+0

J'ai essayé toutes sortes de filtrage. Tout ce que j'ai accompli jusqu'ici, était de récupérer le fichier entier, si le tableau "listing" avait une entrée avec le "id" 42. – McClane

Répondre

0

Tout d'abord, stockez-vous des fiches en tant que type de données object ou nested? Je ne pense pas que ça va fonctionner si elle est un object, essayez donc l'exemple suivant:

PUT /test 
{ 
    "mappings": { 
    "_default_": { 
     "properties": { 
     "listing": { 
      "type": "nested" 
     } 
     } 
    } 
    } 
} 

PUT /test/aa/1 
{ 
    "listing": [ 
    { 
     "person": { 
     "id": 42 
     }, 
     "ranking": { 
     "position": { 
      "standard": 2 
     } 
     } 
    }, 
    { 
     "person": { 
     "id": 55 
     }, 
     "ranking": { 
     "position": { 
      "standard": 7 
     } 
     } 
    } 
    ] 
} 

PUT /test/aa/2 
{ 
    "listing": [ 
    { 
     "person": { 
     "id": 42 
     }, 
     "ranking": { 
     "position": { 
      "standard": 5 
     } 
     } 
    }, 
    { 
     "person": { 
     "id": 55 
     }, 
     "ranking": { 
     "position": { 
      "standard": 6 
     } 
     } 
    } 
    ] 
} 

GET test/_search 
{ 
    "size": 0, 
    "aggs": { 
    "nest": { 
     "nested": { 
     "path": "listing" 
     }, 
     "aggs": { 
     "persons": { 
      "terms": { 
      "field": "listing.person.id", 
      "size": 10 
      }, 
      "aggs": { 
      "avg_standard": { 
       "avg": { 
       "field": "listing.ranking.position.standard" 
       } 
      } 
      } 
     } 
     } 
    } 
    } 
} 

Cela m'a apporté le résultat suivant:

{ 
    "took": 1, 
    "timed_out": false, 
    "_shards": { 
    "total": 5, 
    "successful": 5, 
    "failed": 0 
    }, 
    "hits": { 
    "total": 2, 
    "max_score": 0, 
    "hits": [] 
    }, 
    "aggregations": { 
    "nest": { 
     "doc_count": 4, 
     "persons": { 
     "doc_count_error_upper_bound": 0, 
     "sum_other_doc_count": 0, 
     "buckets": [ 
      { 
      "key": 42, 
      "doc_count": 2, 
      "avg_standard": { 
       "value": 3.5 
      } 
      }, 
      { 
      "key": 55, 
      "doc_count": 2, 
      "avg_standard": { 
       "value": 6.5 
      } 
      } 
     ] 
     } 
    } 
    } 
} 

Il ne semble correct.

+0

Merci beaucoup. Le mappage par défaut généré: "listing": { "properties": {...} } mais, comment l'avez-vous interrogé pour obtenir exactement ce résultat? – McClane

+0

@McClane si cela a fonctionné pour vous, vérifiez cela comme accepté;) –

+0

Merci beaucoup! Exactement ce que je cherchais. – McClane