2016-07-20 6 views
1

質問の策定方法がわかりません。 私はElasticsearch 2.2を使用しています。弾性検索:2つのフィールドに集約

は5つの文書で作られたデータセットの例で始まるのをしてみましょう:

[ 
    { 
    "header": { 
     "called_entity": { "uuid": "a" }, 
     "coverage_entity": {}, 
     "sucessful_transfers": 1 
    } 
    }, 
    { 
    "header": { 
     "called_entity": { "uuid": "a" }, 
     "coverage_entity": { "uuid": "b" }, 
     "sucessful_transfers": 1 
    } 
    }, 
    { 
    "header": { 
     "called_entity": { "uuid": "b" }, 
     "coverage_entity": { "uuid": "a" }, 
     "sucessful_transfers": 1 
    } 
    }, 
    { 
    "header": { 
     "called_entity": { "uuid": "b" }, 
     "coverage_entity": { "uuid": "a" }, 
     "sucessful_transfers": 0 
    } 
    } 
] 

called_entityは常にUUIDを持っています。 coverage_entityは空でもよく、uuidであってもよい。私が欲しいもの

をcalled_entity.uuidかをcoverage_entity.uuid、その後、文書やsuccessful_transfersの和の合計量をカウントのいずれかに集約することです。 ので、これらの5つのドキュメントのために、私は結果としてそのようなものがあるでしょう:

uuid,doc_count,successful_transfers_count 
"a",4,3 
"b",3,2 

問題は、それが同じ文書は、いくつかの集計で使用することができる手段がある限り集約キーはのいずれかであるとしてcalled_entity.uuidまたはcoverage_entity.uuuid(私はそれが可能かどうかはわかりません、なぜ私はここに掲載しているのですか)。単にに集約されて私が現在やっている

フィールドをcalled_entity.uuidが、十分ではありません、もちろん:

uuid,doc_count,successful_transfers_count 
"a",2,2 
"b",2,1 

{ 
    "size": 0, 
    "query": { 
    "match_all": {} 
    }, 
    "aggs": { 
    "dim_1": { 
     "terms": { 
     "field": "header.called_entity.uuid", 
     "size": 0 
     }, 
     "aggs": { 
     "successful_transfers": { 
      "sum": { 
      "field": "header.successful_transfers" 
      } 
     } 
     } 
    } 
    } 
} 

私のようなものを提供します。 ..私が望むものではない。だから、いくつかの値を集計するには、特定の集計に対してまたはを集計することができます。集計の文書だけでなく、すべての文書にある値に基づいてデータを計算しますか?

ありがとうございます。

答えて

1
{ 
    "size": 0, 
    "query": { 
    "match_all": {} 
    }, 
    "aggs": { 
    "dim1": { 
     "terms": { 
     "script" : "return doc['header.called_entity.uuid'] + doc['header.coverage_entity.uuid']", 
     "size": 10 
     }, 
     "aggs": { 
     "successful_transfers": { 
      "sum": { 
      "field": "header.successful_transfers" 
      } 
     } 
     } 
    } 
    } 
} 
+0

... Damn。できます。どうもありがとうございます。どのように動作しているのか正確に説明できますか? – Raphael

+1

この集約は、両方のフィールドから、そのスクリプトを使用する 'called_entity.uuid'と' coverage_entity.uuid'という用語を生成します。あなたの集計は1つのフィールドだけを見ていて、あなたが言ったように、両方の値を同時に必要とします。 –

+0

さて、私は内部的にどのように動作するのか分かりました。どうもありがとうございました。 – Raphael

関連する問題