Elasticsearch7.10问卷场景多条件nested嵌套聚合查询问题求解
问题根因
你当前查询的错误本质是nested聚合的上下文作用域限制:
- 执行
path:answers的nested聚合后,后续所有聚合的上下文都是单个answers子文档,每个子文档只会对应一个subject(要么是sbj_a,要么是sbj_b,不可能同时存在两个subject) - 你在sbj_a的terms桶中做后续聚合,只能拿到当前sbj_a子文档的字段,自然不可能返回sbj_b的相关数据。
方案1:直接过滤统计总数(性能最优,适合仅统计总数的场景)
如果只需要获取满足「sbj_a选ans_02/03且sbj_b选ans_11」的用户总数,直接走查询过滤即可,无需复杂聚合,性能最高:
{ "size": 0, "track_total_hits": true, "query": { "bool": { "filter": [ { "nested": { "path": "answers", "query": { "bool": { "must": [ {"term": {"answers.subject": "sbj_a"}}, {"terms": {"answers.answer.keyword": ["ans_02", "ans_03"]}} ] } } } }, { "nested": { "path": "answers", "query": { "bool": { "must": [ {"term": {"answers.subject": "sbj_b"}}, {"term": {"answers.answer.keyword": "ans_11"}} ] } } } } ] } } }
返回结果中hits.total.value就是你需要的符合条件的用户总数。
方案2:交叉聚合方案(适合多维度交叉统计场景)
如果需要在筛选sbj_a答案的基础上,同时统计对应群体其他题目的答案分布,可以用reverse_nested跳出当前nested上下文,回到根文档后重新进入nested聚合统计其他题目数据:
{ "size": 0, "aggs": { "nested_answers": { "nested": { "path": "answers" }, "aggs": { "filter_sbj_a": { "filter": { "bool": { "must": [ {"term": {"answers.subject": "sbj_a"}}, {"terms": {"answers.answer.keyword": ["ans_02", "ans_03"]}} ] } }, "aggs": { "back_to_root": { "reverse_nested": {}, "aggs": { "nested_again": { "nested": { "path": "answers" }, "aggs": { "filter_sbj_b": { "filter": { "bool": { "must": [ {"term": {"answers.subject": "sbj_b"}}, {"term": {"answers.answer.keyword": "ans_11"}} ] } } } } } } } } } } } } }
最终filter_sbj_b的doc_count就是符合两个条件的用户总数。
内容的提问来源于stack exchange,提问作者Yu-hsien Lee
相关产品推荐
相关产品推荐

