2016-07-29 58 views
1

不知道如何制定问题。 我正在使用Elasticsearch 2.2。Elasticsearch:使用存储桶值过滤聚合

让我们先从数据集的一个例子,形成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总是有UUIDcoverage_entity可以是空的,或者具有uuid

我使用脚本来聚集在任called_entity.uuidcoverage_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

如何使用聚合键的值过滤我的聚合?例如,如果我要计算每个存储桶的数量,则只有uuid取自header.called_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" 
      } 
     }, 
     "from_called_entity": { 
      "filter": { 
      "term": { "header.called_entity.uuid": BUCKET_KEY } 
      } 
     } 
     } 
    } 
    } 
} 

回答

0

不知道这是可能的。密钥本身仅作为分类选项提供。

你可以使用像这样:

{ 
    "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.sucessful_transfers" 
      } 
     } 
     } 
    }, 
    "called_entity_source": { 
     "terms": { 
     "field": "header.called_entity.uuid", 
     "size": 10 
     } 
    }, 
    "coverage_entity_source": { 
     "terms": { 
     "field": "header.coverage_entity.uuid", 
     "size": 10 
     } 
    } 
    } 
} 

和输出会是这样的:

"called_entity_source": { 
    "doc_count_error_upper_bound": 0, 
    "sum_other_doc_count": 0, 
    "buckets": [ 
     { 
      "key": "a", 
      "doc_count": 2 
     }, 
     { 
      "key": "b", 
      "doc_count": 2 
     } 
    ] 
    }, 
    "coverage_entity_source": { 
    "doc_count_error_upper_bound": 0, 
    "sum_other_doc_count": 0, 
    "buckets": [ 
     { 
      "key": "a", 
      "doc_count": 2 
     }, 
     { 
      "key": "b", 
      "doc_count": 1 
     } 
    ] 
    }, 
    "dim1": { 
    "doc_count_error_upper_bound": 0, 
    "sum_other_doc_count": 0, 
    "buckets": [ 
     { 
      "key": "a", 
      "doc_count": 4, 
      "successful_transfers": { 
       "value": 3 
      } 
     }, 
     { 
      "key": "b", 
      "doc_count": 3, 
      "successful_transfers": { 
       "value": 2 
      } 
     } 
    ] 
    } 

如果你真的需要有特定的方式JSON,添加另一个决赛在您的应用程序中进行一步处理,结果是稍后处理结果。上述结果确实包含您需要的信息,但coverage_entity_sourcecalled_entity_source的密钥不在dim聚合下。

+0

是的,这对我的简化示例很有用,但是我需要在每个集合上执行更复杂的过滤器,这些集合在被调用实例,coverage_entity,两者和/或其他字段上都是布尔条件。无论如何,谢谢......我希望钥匙至少可以在脚本中使用,但我无法在文档或其他问题中找到任何内容...... – Raphael

+0

实际上,它的工作原理(我合并了服务器端的两个聚合,收到ElasticSearch的响应后)。非常感谢! – Raphael