首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >结合多个桶和聚合的弹性搜索

结合多个桶和聚合的弹性搜索
EN

Stack Overflow用户
提问于 2018-01-09 00:59:49
回答 1查看 4.6K关注 0票数 2

让我们假设我们查看的数据相当简单--索引中的每个文档都有这样的结构:

代码语言:javascript
运行
复制
{
    "Time": "2018-01-01T19:35:00.0000000Z",
    "Country": "Germany",
    "Addr": "security.web.com",
    "FailureCount": 5,
    "SuccessCount": 50
}

我的问题基本上可以归结为我如何去做这样的事情:two.html。具体来说,我试图对CountryAddr的所有组合执行相同的聚合(查询如下)。下面是我当前的查询尝试。我通过一个5分钟的粒度进行聚合(这是我的需求的一部分),到目前为止,我只能基于one查询进行聚合。

代码语言:javascript
运行
复制
{
"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分钟的桶)。相反,我希望跨聚合所有组合( of CountryAddr )(超过5分钟的桶)。

也就是说,我希望为所有拥有script"Addr": "security.web.com"的文档,为所有具有"Country": "United States""Addr": "security.web.com"的文档,等等,为所有AddrCountry请求提供聚合结果/度量(如在桶中的"Country": "Germany""Addr": "security.web.com"中所列出的)。这在一个Elasticsearch请求中可能吗?我在这里最好的选择是什么?

后续

这是否也可以不跨Addrs和Countrys的所有组合,而是跨Addrs和Countrys的特定组合(我可以在查询中说明这一点)?还是我在一个请求中超出了ES的能力?

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-01-10 14:04:38

如果您想在1查询中这样做,您可以尝试将其分聚合4次。

代码语言:javascript
运行
复制
"aggs": {
    "countries": {
        "terms": {
            "field": country,
            "size": 300
         },
         "aggs": {
             "addrs": {
                "terms": {
                    "field": "Addr",
                     "size": 1000
                 },
                 "aggs": {
                     "2": {
                        "date_histogram":.....// your original query
                 }
              }
          }
     }
 }

但是,我不建议在大量的数据上这样做,因为这样的深度子聚合会非常慢。如果确实需要在单个查询中执行此操作,则创建一个字段,该字段在索引和聚合时将country和addr组合在一个字段中。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48160124

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档