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и все Countrys. Возможно ли это в одном запросе Elasticsearch? Какой мой лучший вариант может быть здесь?

Следовать за

Это также возможно сделать не для всех комбинаций Addrс и Countryс, но вместо этого через конкретные комбинации Addrс и Countrys (что я мог бы выложить в запросе)? Или я перегружаюсь за пределы возможностей 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
                 }
              }
          }
     }
 }

Однако я не рекомендовал бы делать это на большом количестве данных, поскольку такие глубокие субагрегации были бы очень медленными. Если вам действительно нужно сделать это в одном запросе, создайте поле, которое объединяет страну и адрес в одном поле при индексации и агрегировании по нему.

Если вам нужны конкретные комбинации, просто поместите их в агрегацию фильтров и добавьте ее в свой запрос.

Другие вопросы по тегам