Elasticsearch 结合多个存储桶和聚合

2023-12-05

假设我们正在查看相当简单的数据——索引中的每个文档都具有以下结构:

{
    "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 and Addr。我当前的查询尝试如下。我聚合了 5 分钟的粒度(这是我的要求的一部分),到目前为止我只能根据one query.

{
"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"
            }
         }
      }
   }
}

这是可行的,但只是聚合与布尔过滤器匹配的所有文档(超过 5 分钟的存储桶)。相反,我想汇总所有组合 of Country and Addr(超过 5 分钟的时间段)。

也就是说,我想要一个聚合结果/指标(如script在桶里4)对于所有具有"Country": "Germany" and "Addr": "security.web.com",适用于所有具有"Country": "United States" and "Addr": "security.web.com",等等,对于所有Addr和所有Countrys。这可以在一个 Elasticsearch 请求中实现吗?我最好的选择是什么?

跟进

这也可以不跨越吗all的组合Addrs and Countrys,而是跨越特定的组合Addrs and Countrys(我可能会在查询中列出)?或者我是否在一个请求中超出了 ES 的能力?

Thanks!


如果您希望在 1 个查询中获得此结果,您可以尝试对其进行子聚合 4 次。

"aggs": {
    "countries": {
        "terms": {
            "field": country,
            "size": 300
         },
         "aggs": {
             "addrs": {
                "terms": {
                    "field": "Addr",
                     "size": 1000
                 },
                 "aggs": {
                     "2": {
                        "date_histogram":.....// your original query
                 }
              }
          }
     }
 }

但是,我不建议对大量数据执行此操作,因为这种深度子聚合会非常慢。如果您确实需要在单个查询中执行此操作,请创建一个字段,将国家/地区和地址组合在单个字段中,同时对其进行索引和聚合。

如果您想要特定的组合,只需将您的组合放入过滤器聚合并将其与您的查询进行子聚合。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Elasticsearch 结合多个存储桶和聚合 的相关文章

随机推荐