Elasticsearch, объединяющий несколько ведер и агрегатов
Давайте предположим, что мы смотрим на данные, которые достаточно просты - каждый документ в нашем индексе имеет такую структуру:
{
"Time": "2018-01-01T19:35:00.0000000Z",
"Country": "Germany",
"Addr": "security.web.com",
"FailureCount": 5,
"SuccessCount": 50
}
По сути, мой вопрос сводится к тому, как мне поступить примерно так: https://www.elastic.co/guide/en/elasticsearch/guide/current/_combining_the_two.html. В частности, я пытаюсь выполнить одну и ту же агрегацию (запрос ниже) для всех комбинаций Country
а также Addr
, Моя текущая попытка запроса ниже. Я агрегирую по 5-минутному зерну (это является частью моих требований), и до сих пор я мог агрегировать только на основе одного запроса.
{
"size":0,
"query":{
"bool":{
"filter":[
{
"range":{
"Time":{
"gte":"1514835300000",
"lte":"1514835600000",
"format":"epoch_millis"
}
}
},
{
"query_string":{
"analyze_wildcard":true,
"query":"Country:Germany"
}
}
]
}
},
"aggs":{
"2":{
"date_histogram":{
"interval":"5m",
"field":"Time",
"min_doc_count":0,
"extended_bounds":{
"min":"1514835300000",
"max":"1514835600000"
},
"format":"epoch_millis"
},
"aggs":{
"4":{
"bucket_script":{
"buckets_path":{
"success":"9",
"failure":"10"
},
"script":"( params.success + params.failure )"
}
},
"9":{
"sum":{
"field":"SuccessCount"
}
}
"10":{
"sum":{
"field":"FailureCount"
}
}
}
}
}
Это работает, но просто объединяет все документы, которые соответствуют фильтру bool (более 5 минут). Вместо этого я хотел объединить все комбинации Country
а также Addr
(более 5 минут).
То есть я хотел бы получить результат / показатель агрегации (как изложено в script
в ведре 4
) для всех документов, которые имеют "Country": "Germany"
а также "Addr": "security.web.com"
, один для всех документов, которые имеют "Country": "United States"
а также "Addr": "security.web.com"
и так далее, для всех Addr
и все Country
s. Возможно ли это в одном запросе Elasticsearch? Какой мой лучший вариант может быть здесь?
Следовать за
Это также возможно сделать не для всех комбинаций Addr
с и Country
с, но вместо этого через конкретные комбинации Addr
с и Country
s (что я мог бы выложить в запросе)? Или я перегружаюсь за пределы возможностей ES в рамках одного запроса?
Спасибо!
1 ответ
Если вы хотите это в 1 запросе, вы можете просто попытаться выполнить его агрегирование 4 раза.
"aggs": {
"countries": {
"terms": {
"field": country,
"size": 300
},
"aggs": {
"addrs": {
"terms": {
"field": "Addr",
"size": 1000
},
"aggs": {
"2": {
"date_histogram":.....// your original query
}
}
}
}
}
Однако я не рекомендовал бы делать это на большом количестве данных, поскольку такие глубокие субагрегации были бы очень медленными. Если вам действительно нужно сделать это в одном запросе, создайте поле, которое объединяет страну и адрес в одном поле при индексации и агрегировании по нему.
Если вам нужны конкретные комбинации, просто поместите их в агрегацию фильтров и добавьте ее в свой запрос.