如何通过一次查询获取所有匹配test-*索引的最新文档?
如何批量获取匹配
test-*模式的每个索引的最新文档 你可以通过以下两种方式实现需求,确保每个匹配的索引返回1条最新文档,最终得到6条结果:
方法一:使用聚合查询(推荐,适合索引数量较多的场景)
通过按索引名称聚合,结合top_hits获取每个分组的最新文档,一次请求即可完成:
GET test-*/_search { "size": 0, // 不返回普通搜索结果,只保留聚合数据 "aggs": { "group_by_index": { "terms": { "field": "_index", "size": 1000 // 设置足够大的值,确保覆盖所有匹配的test-*索引 }, "aggs": { "latest_document": { "top_hits": { "size": 1, "sort": [ { "@timestamp": { // 替换为你实际用来判断文档新旧的字段,比如create_time "order": "desc" } } ] } } } } } }
说明:
test-*会匹配所有以test-开头的索引;terms聚合按_index字段将结果分组,每个组对应一个索引;top_hits聚合在每个分组内按指定字段降序排序,只取第一条(最新的)文档;- 如果你的文档没有
@timestamp字段,可以替换为自增的_id(需确保_id能代表创建顺序)或业务自定义的时间字段。
方法二:使用批量查询(适合索引数量较少的场景)
通过_msearch接口批量提交单个索引的查询请求,每个请求返回对应索引的最新文档:
POST _msearch {"index": "test-node1"} {"size": 1, "sort": [{"@timestamp": {"order": "desc"}}]} {"index": "test-node2"} {"size": 1, "sort": [{"@timestamp": {"order": "desc"}}]} {"index": "test-node3"} {"size": 1, "sort": [{"@timestamp": {"order": "desc"}}]} {"index": "test-node4"} {"size": 1, "sort": [{"@timestamp": {"order": "desc"}}]} {"index": "test-node5"} {"size": 1, "sort": [{"@timestamp": {"order": "desc"}}]} {"index": "test-node6"} {"size": 1, "sort": [{"@timestamp": {"order": "desc"}}]}
说明:
- 每两行对应一个索引的查询:第一行指定索引,第二行定义查询规则(只取1条,按指定字段降序);
- 这种方式写法直观,但如果后续新增
test-*索引,需要手动添加对应的查询行,不如聚合方法灵活。
内容的提问来源于stack exchange,提问作者kuldeep gupta
相关产品推荐
相关产品推荐

