2016-07-29 2 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 всегда имеет 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.

Как я могу отфильтровать свою агрегацию, используя значение ключа агрегации? Например, если я хочу подсчитать, для каждого ведра, сколько документов есть их 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_source и called_entity_source не относятся к агрегации dim.

+0

Да, это будет работать для моего упрощенного примера, но мне нужно сделать более сложные фильтры для каждой агрегации, которые являются логическими условиями для объектов named_entity, coverage_entity, both и/или других полей. Спасибо в любом случае ... Я надеялся, что ключ может быть по крайней мере доступен в скрипте, но я не мог найти ничего в документах или в других вопросах ... – Raphael

+0

На самом деле, он работает (я объединил обе агрегации на стороне сервера, после получения ответа от ElasticSearch). Большое спасибо! – Raphael