質問の仕方がわからない。Elasticsearch 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のいずれかに集約します。
{
"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"
}
}
}
}
}
}
これで、集計によって、 header.called_entity.uuid または header.coverage_entity.uuid のいずれかから用語が生成されました。
集計キーの値を使用して集計をフィルター処理するにはどうすればよいですか? たとえば、バケットごとに、header.called_entity.uuidのみから取得されたuuidを持つドキュメントの数を数えたいとします。そんな感じ:
{
"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"
}
},
"from_called_entity": {
"filter": {
"term": { "header.called_entity.uuid": BUCKET_KEY }
}
}
}
}
}
}