2016-07-29 146 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

相關問題