让我们假设我们查看的数据相当简单--索引中的每个文档都有这样的结构:
{
"Time": "2018-01-01T19:35:00.0000000Z",
"Country": "Germany",
"Addr": "security.web.com",
"FailureCount": 5,
"SuccessCount": 50
}
我的问题基本上可以归结为我如何去做这样的事情: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过滤器匹配的文档上聚合(超过5分钟的桶)。相反,我希望跨聚合所有组合( of Country
和Addr
)(超过5分钟的桶)。
也就是说,我希望为所有拥有script
和"Addr": "security.web.com"
的文档,为所有具有"Country": "United States"
和"Addr": "security.web.com"
的文档,等等,为所有Addr
和Country
请求提供聚合结果/度量(如在桶中的"Country": "Germany"
和"Addr": "security.web.com"
中所列出的)。这在一个Elasticsearch请求中可能吗?我在这里最好的选择是什么?
后续
这是否也可以不跨Addr
s和Country
s的所有组合,而是跨Addr
s和Country
s的特定组合(我可以在查询中说明这一点)?还是我在一个请求中超出了ES的能力?
谢谢!
发布于 2018-01-10 14:04:38
如果您想在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组合在一个字段中。
如果您想要特定的组合,只需将您的组合放在一个过滤器聚合中并与您的查询进行子聚合。
https://stackoverflow.com/questions/48160124
复制相似问题