Elasticsearch多term查询下获取每个含throughput字段接口的最新文档
你现有DSL的缺陷是没有按接口名称分组,只会返回所有匹配文档中最新的1条,无法实现每个接口各返回1条最新数据的需求。修正后的实现如下:
GET /interface-2021.11/_search { "size": 0, "query": { "bool": { "should": [ { "term": { "interface_name.keyword": "Gi0/0/2 on (EXT-01)" } }, { "term": { "interface_name.keyword": "Gi0/0/1 on (EXT-02)" } }, { "term": { "interface_name.keyword": "Ethernet1/61 on (DC-01)" } }, { "term": { "interface_name.keyword": "Ethernet1/17 on (DC-02)" } } ], "minimum_should_match": 1, "filter": [ { "exists": { "field": "throughput" } } ] } }, "aggs": { "group_by_interface": { "terms": { "field": "interface_name.keyword", "size": 10 }, "aggs": { "latest_doc": { "top_hits": { "size": 1, "sort": [ { "@timestamp": { "order": "desc" } } ] } } } } } }
核心改动说明:
- 新增
size: 0配置,不需要返回原始命中的全量文档,仅返回聚合结果即可,降低数据传输量 - 新增第一层
group_by_interfaceterms聚合,按接口名称分组,确保每个指定接口单独统计 - 分组内嵌套
latest_doctop_hits聚合,配置size:1仅返回每个分组中按时间倒序排序后的第一条文档,也就是对应接口的最新数据
查询返回后,你可以在aggregations.group_by_interface.buckets下拿到每个接口的分组结果,每个分组的latest_doc.hits.hits[0]就是对应接口的最新文档。
内容的提问来源于stack exchange,提问作者Syirtblplmj
相关产品推荐
相关产品推荐

