2017-07-21 3 views
0

Mit dieser Abbildung:Elasticsearch verschachtelte Aggregationen liefern doppelte Ergebnisse

PUT pizzas 
{ 
    "mappings": { 
    "pizza": { 
     "properties": { 
     "name": { 
      "type": "keyword" 
     }, 
     "types": { 
      "type": "nested", 
      "properties": { 
      "topping": { 
       "type": "keyword" 
      }, 
      "base": { 
       "type": "keyword" 
      } 
      } 
     } 
     } 
    } 
    } 
} 

Und diese Daten:

PUT pizzas/pizza/1 
{ 
    "name": "meat", 
    "types": [ 
    { 
     "topping": "bacon", 
     "base": "normal" 
    }, 
    { 
     "topping": "pepperoni", 
     "base": "normal" 
    } 
    ] 
} 

PUT pizzas/pizza/2 
{ 
    "name": "veg", 
    "types": [ 
    { 
     "topping": "broccoli", 
     "base": "normal" 
    } 
    ] 
} 

Wenn ich diese verschachtelte Aggregations Abfrage:

GET pizzas/_search 
{ 
    "size": 0, 
    "aggs": { 
    "types_agg": { 
     "nested": { 
     "path": "types" 
     }, 
     "aggs": { 
     "base_agg": { 
      "terms": { 
      "field": "types.base" 
      } 
     } 
     } 
    } 
    } 
} 

ich dieses Ergebnis zu erhalten :

{ 
    "took": 2, 
    "timed_out": false, 
    "_shards": { 
    "total": 5, 
    "successful": 5, 
    "failed": 0 
    }, 
    "hits": { 
    "total": 2, 
    "max_score": 0, 
    "hits": [] 
    }, 
    "aggregations": { 
    "types_agg": { 
     "doc_count": 3, 
     "base_agg": { 
     "doc_count_error_upper_bound": 0, 
     "sum_other_doc_count": 0, 
     "buckets": [ 
      { 
      "key": "normal", 
      "doc_count": 3 
      } 
     ] 
     } 
    } 
    } 
} 

Ich erwartete, dass meine Aggregation eine doc_count von 2 zurückgibt, da es nur zwei Dokumente gibt, die meiner Abfrage entsprechen. Es ist jedoch klar, dass es, da es sich um einen invertierten Index handelt, 3 Ergebnisse und somit 3 Dokumente finden.

Gibt es trotzdem, es zu erhalten, um eindeutige Dokumentenzählungen zurückzugeben?

(getestet in Elasticsearch 5.4.3)

+1

wie das ist, wie ich das verstehe. Bei verschachtelter Aggregation, wenn Sie verschachtelt sind, werden die Ergebnisse im Kontext des verschachtelten Typs zurückgegeben. Wie es den Aggregator verlässt, dort reduzieren. Sie werden also einen reverse_nested drücken, um zu root oder so weiter zu kommen. Verwenden Sie https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-reverse-nested-aggregation.html – user3775217

Antwort

0

entdeckt gerade die answer kurz nach der Frage zu stellen.

die Aggregation Abfrage ändern sein:

GET pizzas/_search 
{ 
    "size": 0, 
    "aggs": { 
    "types_agg": { 
     "nested": { 
     "path": "types" 
     }, 
     "aggs": { 
     "base_agg": { 
      "terms": { 
      "field": "types.base" 
      }, 
      "aggs": { 
      "top_reverse_nested": { 
       "reverse_nested": {} 
      } 
      } 
     } 
     } 
    } 
    } 
} 

Yields das Ergebnis:

{ 
    "took": 5, 
    "timed_out": false, 
    "_shards": { 
    "total": 5, 
    "successful": 5, 
    "failed": 0 
    }, 
    "hits": { 
    "total": 2, 
    "max_score": 0, 
    "hits": [] 
    }, 
    "aggregations": { 
    "types_agg": { 
     "doc_count": 3, 
     "base_agg": { 
     "doc_count_error_upper_bound": 0, 
     "sum_other_doc_count": 0, 
     "buckets": [ 
      { 
      "key": "normal", 
      "doc_count": 3, 
      "top_reverse_nested": { 
       "doc_count": 2 
      } 
      } 
     ] 
     } 
    } 
    } 
} 

Der wichtige Teil, die zur Abfrage hinzugefügt wurde, war:

"aggs": { 
    "top_reverse_nested": { 
     "reverse_nested": {} 
    } 
} 

Reverse-verschachtelte beitreten Zurück zum Ursprung des Dokuments, so dass nur eindeutige Aggregationen erhalten werden.

Sie können über reverse_nestedhere lesen.

Verwandte Themen