2017-07-21 33 views
0

を返します。Elasticsearchネストされた集計このマッピングでは、重複する結果

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

そして、このデータ:

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

私は、このネストされた集計クエリを実行した場合:

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

を、私はこの結果を得ます:

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

私は私のクエリに一致する唯一の二つの文書があるので、私の凝集が2のdoc_countを返すことが期待されます。しかし、転置インデックスだから、それは3件の結果を見つけるため、3つのドキュメントされていることは明らかです。

一意の文書数を返すためにとにかくありますか?

(Elasticsearch 5.4.3でテスト)

+1

このように私はこれを理解しています。あなたのネストされたならば、ネストされた集計では、これは、ネストされたタイプのコンテキストで結果を返します。それがアグリゲーターをそこから減らすのと同じように。 reverse_nestedをプッシュしてルートなどに戻ってきます。 https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-reverse-nested-aggregation.htmlを使用してください。 – user3775217

答えて

0

だけですぐに質問をした後answerを発見しました。する集計クエリを変更

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

は結果が得られます。

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

クエリに追加された重要な部分だった:リバースは、参加入れ子に

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

ドキュメントのルートに戻ってユニークな集合のみを取得します。

あなたはおよそreverse_nestedhereを読むことができます。

関連する問題