找到问题的解决办法了么?

Elasticsearch对聚合后的内容doc_count进行再次聚合

Elasticsearch | 作者 Lnote | 发布于2019年11月29日 | 阅读数:2727

ES版本:6.5.1
现在需要统计人群中做了一次、两次、三次、四次体检的人数,为了不增加应用层面的复杂度,直接在索引中存储了personId和examDate分别标识居民ID和体检日期,希望通过聚合的方式实现上述需求。
{
"query" : {
"constant_score" : {
"filter" : {
"range" : {
"examDate" : {
"gte" : 2019,
"lt" : 2020
}
}
}
}
},
"size" : 0,
"aggs" : {
"person" : {
"terms" : {
"field" : "personId"
}
}
}
}
这样确实是可以直观的看到每个人做了几次体检,但是还需要将做了一次、两次体检的结果进行分类,相当于需要对doc_count再做一次group by操作。
为此我增加了一个常量字段version,它的值始终为1。
{
    "query" : {
        "constant_score" : {
            "filter" : {
                "range" : {
                    "examDate" : {
                        "gte" : 2019,
                        "lt"  : 2020
                    }
                }
            }
        }
    },
    "size" : 0,
    "aggs" : {
        "person" : {
            "terms" : {
                "field" : "personId"
            }
            ,
            "aggs" :{
                "sum_version" : {
                    "sum" : {
                        "field" : "version"
                    }
                },
                "version_filter" : {
                    "bucket_selector": {
                        "buckets_path": {
                          "totalVersion": "sum_version"
                        },
                        "script": "params.totalVersion == 2"
                    }
                }
            }
        }
    }
}
这样做的结果是,我能查到做了2次体检的人;但是有两个缺陷:
1.不知道做了2次体检的总人数,只会返回size大小的结果,这里的size又不能设置得很大。
2.不能在一个操作中把做了1次、2次、3次的人数都统计出来
 
不知道有没有更好的方式实现类似的需求?
 
已邀请:

要回复问题请先登录注册