假设我想对服务器日志索引进行聚合,我想要移动和非移动设备的单独结果。即如果浏览器类型在某个列表中,则将结果放入移动存储桶中,否则将结果放入非移动存储桶中。
我尝试过这样的事情:(包括对浏览器类型的直接细分以进行比较)
{
"aggs": {
"group_by_mobility": {
"filters": {
"filters": {
"mobile": {
"terms": {
"browser.os.family": [
"Android",
"iOS",
"Windows Phone",
"Blackberry OS"
]
}
},
"non-mobile": {
"not": {
"terms": {
"browser.os.family": [
"Android",
"iOS",
"Windows Phone",
"Blackberry OS"
]
}
}
}
}
}
},
"group_by_browser": {
"terms": {
"field": "browser.os.family",
"size": 0
}
}
},
"size": 0
}
这样运行,但答案看起来并不正确。我得到了第一个聚合:
"group_by_mobility" : {
"buckets" : {
"mobile" : {
"doc_count" : 122250
},
"non-mobile" : {
"doc_count" : 711658
}
}
}
如果我在移动浏览器的第二个聚合输出中添加数字,我会得到122404,它位于同一个球场。但是,所有其他浏览器类型的总和是304177,这远不及711658。
我采取了错误的做法吗?感谢任何提示。
答案 0 :(得分:0)
您想要的是运行2个单独的聚合,每个聚合都有不同的筛选条件。这是伪代码:
GET index1/type1/_search
{
"size": 0,
"aggs": {
"ag1": {
"filter": {
"terms": {
"authInput.address.address1": [
"Android",
"iOS",
"Windows Phone",
"Blackberry OS"
]
}
},
"aggs": {
"ag1.terms1": {
"terms": {
"field": "authInput.address.address1",
"size": 10
}
}
}
},
"ag2": {
"filter": {
"not": {
"filter": {
"terms": {
"authInput.address.address1": [
"Android",
"iOS",
"Windows Phone",
"Blackberry OS"
]
}
}
}
},
"aggs": {
"ag2.terms1": {
"terms": {
"field": "authInput.address.address1",
"size": 10
}
}
}
}
}