背景需求是只需要文档的_id字段,并且_id组装成一个数组。
在搜索请求中使用 script_fields 来整理 _id 为数组输出:
POST goods_info/_search?size=0
{
"query": {
"term": {
"brand": {
"value": "MGC"
}
}
},
"_source":false,
"aggs": {
"ids_as_array": {
"scripted_metric": {
"init_script": "state.ids = []",
"map_script": "state.ids.add(doc['_id'].value)",
"combine_script": "return state.ids",
"reduce_script": "def ids = []; for (s in states) { ids.addAll(s) } return ids"
}
}
}
}
代码说明:
size: 0
:表示不需要实际返回任何文档,因为我们只关心聚合结果。scripted_metric
:一个聚合类型,允许在多个阶段中使用脚本来聚合数据。init_script
:在每个分片上初始化状态。在这里,我们初始化了一个空的列表 ids。map_script
:在每个文档上执行。这里,我们将文档的 _id 添加到 ids 列表中。combine_script
:在每个分片上执行,用于合并每个分片的结果。在这里,我们直接返回 ids 列表。reduce_script
:在所有分片结果上执行,用于合并所有分片的结果。在这里,我们将所有分片的 ids 列表合并成一个大的列表。
输出结果: