Elasticsearch 结合多个桶和聚合
Elasticsearch combining multiple buckets and aggregations
假设我们正在查看相当简单的数据 -- 我们索引中的每个文档都具有以下结构:
{
"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 分钟的粒度(这是我要求的一部分),到目前为止,我只能基于 one 查询进行聚合。
{
"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-filter 匹配的所有文档(超过 5 分钟的存储桶)。相反,我想汇总 Country
和 Addr
的所有组合(超过 5 分钟的时间段)。
也就是说,我想为所有具有 "Country": "Germany"
和 "Addr": "security.web.com"
,一个用于包含 "Country": "United States"
和 "Addr": "security.web.com"
的所有文档,依此类推,用于所有 Addr
和所有 Country
。这在一个 Elasticsearch 请求中是否可行?我最好的选择是什么?
跟进
是否也可以不跨越 Addr
和 Country
的 所有 组合,而是跨越 [=13= 的特定组合]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 组合在一个字段中,同时对其进行索引和聚合。
如果您需要特定的组合,只需将您的组合放在 filters aggregation 中,然后将其与您的查询进行子聚合。
假设我们正在查看相当简单的数据 -- 我们索引中的每个文档都具有以下结构:
{
"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 分钟的粒度(这是我要求的一部分),到目前为止,我只能基于 one 查询进行聚合。
{
"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-filter 匹配的所有文档(超过 5 分钟的存储桶)。相反,我想汇总 Country
和 Addr
的所有组合(超过 5 分钟的时间段)。
也就是说,我想为所有具有 "Country": "Germany"
和 "Addr": "security.web.com"
,一个用于包含 "Country": "United States"
和 "Addr": "security.web.com"
的所有文档,依此类推,用于所有 Addr
和所有 Country
。这在一个 Elasticsearch 请求中是否可行?我最好的选择是什么?
跟进
是否也可以不跨越 Addr
和 Country
的 所有 组合,而是跨越 [=13= 的特定组合]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 组合在一个字段中,同时对其进行索引和聚合。
如果您需要特定的组合,只需将您的组合放在 filters aggregation 中,然后将其与您的查询进行子聚合。