2017-06-14 4 views
0

Ich bin neu bei Elasticsearch und kann nicht herausfinden, wie das folgende Problem zu lösen. Der einfachste Weg, mein Problem zu erklären, ist, Ihnen ein Beispiel zu zeigen.Elasticsearch Aggregation nur auf bestimmte Einträge in einem Array

Das folgende Array "Auflistung" ist Teil aller meiner Dateien in Elasticsearch, aber die Einträge variieren, so dass die "Person" mit der "ID" 42, in 50% meiner Dateien sein könnte. Was ich versuche ist, den durchschnittlichen "ranking.position.standard" aller Personen mit der ID 42 in all meinen Dateien in Elasticsearch zu bekommen.

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

Danke für Ihre Hilfe!

+0

Was haben Sie bisher versucht? –

+0

Ich habe alle Arten von Filtern versucht. Alles, was ich bisher erreicht habe, war, die ganze Datei zurück zu bekommen, wenn das "Listing" -Array einen Eintrag mit der "ID" 42 hatte. – McClane

Antwort

0

Speichern Sie als erstes die Listen als object oder nested Datentyp? Ich glaube nicht, es wird funktionieren, wenn es eine object ist, so versuchen Sie das folgende Beispiel:

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" 
       } 
      } 
      } 
     } 
     } 
    } 
    } 
} 

Das bin ich folgendes Ergebnis gebracht hat:

{ 
    "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 
      } 
      } 
     ] 
     } 
    } 
    } 
} 

Es ist richtig scheint.

+0

Vielen Dank. Das Standard-Mapping generiert: "listing": { "Eigenschaften": {...} } aber, wie hast du es abgefragt, um genau dieses Ergebnis zu erhalten? – McClane

+0

@McClane, wenn es für Sie funktioniert hat, aktivieren Sie dieses als akzeptiert;) –

+0

Vielen Dank! Genau das, was ich gesucht habe. – McClane

Verwandte Themen