我有以下es查询:
{
"size": 0,
"aggs" : {
"make": {
"terms" : { "field" : "make", size: 0 },
"aggs": {
"model": {
"terms": {
"field": "model"
}
}
}
}
}
}
这给了我以下(示意图)结果。
---------------------
key: Mercedes
doc_count:201
key: S350
doc_count: 100
key: E200
doc_count: 101
---------------------
key: Bmw
doc_count: 500
key: 750
doc_count: 300
key: 530
doc_count: 200
---------------------
key: SuperCar
doc_count: 300
key: T123
doc_count: 300
但我只需要获得梅赛德斯和宝马的汇总。 SuperCar密钥应该被加入并且根本不显示。
例如,我需要通过子聚合唯一键计数来过滤聚合。
有可能吗?
答案 0 :(得分:0)
泰穆拉兹,
但我只需要获得梅赛德斯和宝马的汇总。 SuperCar密钥应该被加入并且根本不显示。
您可以使用 must_not bool查询或必须查询,具体取决于您的观点,以获取更多信息:
https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-bool-query.html
例如,我需要通过子聚合唯一键计数来过滤聚合。
有可能吗?
如果我说得对,你想知道每个品牌有多少型号,对吧?为此,您可以使用基数聚合:
{
"size": 0,
"aggs" : {
"make": {
"terms" : { "field" : "make", size: 0 },
"aggs": {
"model": {
"terms": {
"field": "model"
}
},
"model_count":{
"cardinality":{
"field":"model"
}
}
}
}
}
}
答案 1 :(得分:0)
我在这里添加一个答案,以防有人有相同的用例。从这个问题来看,我的猜测是作者想根据关键计数过滤聚合结果,例如:搜索至少有 2 个型号的所有汽车品牌。
感谢@lpeixotoo 指出基数聚合,下一步是使用桶选择器聚合,我更新查询如下:
{
"size": 0,
"aggs" : {
"make": {
"terms" : { "field" : "make", size: 0 },
"aggs": {
"model": {
"terms": {
"field": "model"
}
},
"model_count": {
"cardinality": {
"field":"model"
}
},
"model_count_filter": {
"bucket_selector": {
"buckets_path": {
"modelCount": "model_count"
},
"script": "params.modelCount >= 2"
}
}
}
}
}
}