如何基于rating分组返回Elasticsearch中title字段的数组集合?
Elasticsearch按rating分组并返回对应title数组的实现方案
方法一:Terms聚合+Top Hits(简单易上手)
通过terms聚合按rating字段分组,嵌套top_hits聚合仅提取每组的title字段,避免返回完整文档:
GET /你的索引名/_search { "size": 0, // 不返回原始文档,仅保留聚合结果 "aggs": { "rating_groups": { "terms": { "field": "rating" // 若rating是文本类型,需用rating.keyword确保精确分组 }, "aggs": { "group_titles": { "top_hits": { "size": 10000, // 设置足够大的值覆盖分组内所有文档 "_source": ["title"] // 仅返回title字段 } } } } } }
返回结果中,每个rating_groups.buckets条目下的group_titles.hits.hits数组,可直接提取对应rating的所有title值。
方法二:Scripted Metric聚合(直接生成数组)
如果需要直接返回title数组而非嵌套结构,用scripted_metric聚合在分组内直接构建title数组:
GET /你的索引名/_search { "size": 0, "aggs": { "rating_groups": { "terms": { "field": "rating" }, "aggs": { "title_array": { "scripted_metric": { "init_script": "state.titles = []", "map_script": "state.titles.add(doc['title.keyword'].value)", // title为text类型时用keyword子字段,避免分词 "combine_script": "return state.titles", "reduce_script": "return params.vals.flatten()" } } } } } }
此查询返回的每个bucket中,title_array.value就是对应rating的title数组,无需二次遍历提取。
注意事项
- 确保
rating字段映射正确:数值类型可直接分组,文本类型需用keyword子字段实现精确分组。 - 若分组内文档量极大,
top_hits的size不宜过高,避免内存溢出,此时scripted_metric更高效。 - 若
title是text类型,必须用doc['title.keyword'].value获取完整字符串,否则会返回分词后的词语数组。
内容的提问来源于stack exchange,提问作者SudSwastik
相关产品推荐
相关产品推荐

