Elasticsearch如何基于nested对象属性执行collapse分组查询
问题原因
- 你现在的用法混淆了collapse两种inner_hits的作用范围:默认配置下collapse的inner_hits仅返回当前分组代表文档内匹配的嵌套字段内容,不会返回同分组的其他顶层文档
- 若comments字段未设置为
nested类型,数组会被ES扁平化存储,collapse分组时仅取数组第一个值作为分组依据,也会导致分组结果异常
解决方案1:使用terms聚合+top_hits(更适配需求)
这种方式直接按comments.id分组,每个分组返回所有包含该id的顶层文档,符合你的预期。
如果你的comments是nested类型,查询语句如下:
POST /你的索引名/_search?track_total_hits=true { "size": 0, "aggs": { "group_by_comment_id": { "nested": { "path": "comments" }, "aggs": { "comment_id": { "terms": { "field": "comments.id.keyword", // 如果id是数值类型则去掉.keyword后缀 "size": 100 // 调整为你需要返回的分组总数 }, "aggs": { "top_docs": { "top_hits": { "size": 10, // 调整为每个分组需要返回的顶层文档数量 "_source": ["title"] // 按需配置需要返回的文档字段 } } } } } } } }
如果comments是普通object类型,去掉外层的nested聚合,terms的field直接写comments.id即可。
解决方案2:修改collapse配置适配需求
如果你坚持使用collapse功能,需要明确指定inner_hits的类型为返回同分组顶层文档,配置如下:
POST /你的索引名/_search?track_total_hits=true { "collapse": { "field": "comments.id.keyword", "inner_hits": { "name": "same_comment_id_docs", "type": "top", // 关键配置,指定返回同折叠组的顶层文档而非当前文档内的嵌套对象 "size": 10 }, "max_concurrent_group_searches": 3 }, "size": 100 // 调整为你需要返回的分组总数 }
注意:使用collapse方案时,如果comments是nested类型,需要在query部分先加上nested查询匹配所有comments,才能触发正确的分组逻辑。
内容的提问来源于stack exchange,提问作者sagar43
相关产品推荐
相关产品推荐

