结合多个存储桶和聚合的Elasticsearch
让我们假设我们看到的数据相当简单——索引中的每个文档都有以下结构:结合多个存储桶和聚合的Elasticsearch,
Warning: implode(): Invalid arguments passed in /data/phpspider/zhask/webroot/tpl/detail.html on line 45
,,让我们假设我们看到的数据相当简单——索引中的每个文档都有以下结构: { "Time": "2018-01-01T19:35:00.0000000Z", "Country": "Germany", "Addr": "security.web.com", "FailureCount": 5, "SuccessCount": 50 } 我的问题基本上归结为我应该如何着手做这样的事情:。具体地说,我正在尝试对Country和Addr的所有组合执行相同的聚合(下面
{
"Time": "2018-01-01T19:35:00.0000000Z",
"Country": "Germany",
"Addr": "security.web.com",
"FailureCount": 5,
"SuccessCount": 50
}
我的问题基本上归结为我应该如何着手做这样的事情:。具体地说,我正在尝试对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分钟的存储桶)。相反,我想在国家
和地址
的所有组合中进行聚合(超过5分钟)
也就是说,我想要一个聚合结果/度量(如脚本中bucket4
)用于所有具有“国家”:“德国”和“Addr”:“security.web.com”
,一个用于所有具有“国家”:“美国”
和“Addr”:“security.web.com”
,等等,适用于所有Addr
s和所有Country
s。在一个Elasticsearch请求中是否可以这样做?我最好的选择是什么
跟进
这是否也可以不跨越Addr
s和Country
s的所有组合,而是跨越Addr
s和Country
s的特定组合(我可以在查询中列出)?还是我在一个请求中超出了ES的能力
谢谢 如果您希望在1个查询中使用此功能,您可以尝试将其子聚合4次
"aggs": {
"countries": {
"terms": {
"field": country,
"size": 300
},
"aggs": {
"addrs": {
"terms": {
"field": "Addr",
"size": 1000
},
"aggs": {
"2": {
"date_histogram":.....// your original query
}
}
}
}
}
但是,我不建议对大量数据执行此操作,因为这样的深度子聚合将非常缓慢。如果确实需要在单个查询中执行此操作,请创建一个字段,该字段在单个字段中组合country和addr,同时对其进行索引和聚合
如果您想要特定的组合,只需将您的组合放入a中,并使用查询对其进行子聚合即可 非常感谢,这让我成功了!:)是的,我将只修剪到特定的组合,在聚合之前使用bool过滤器,或者像您建议的那样使用过滤器聚合。