如何通过ReactiveElasticsearchClient获取索引文档数与大小?
解决方案
要获取索引的文档计数(IndexDocumentCount)和存储大小(IndexSize),你需要调用Elasticsearch的索引统计接口——因为GetIndexResponse仅返回索引的元数据(配置、映射、别名),而运行时统计数据(文档数、存储大小)需要通过IndicesStatsRequest来获取。结合你使用的spring-data-elasticsearch 5.1.3(对应Elasticsearch 7.17客户端),具体实现如下:
1. 获取索引统计数据(文档数、大小)
使用ReactiveElasticsearchIndicesClient的stats()方法发起统计请求,指定需要获取的核心指标:
ReactiveElasticsearchIndicesClient indicesClient = reactiveElasticsearchClient.indices(); // 构建统计请求,匹配所有索引,仅请求文档和存储相关统计 IndicesStatsRequest statsRequest = new IndicesStatsRequest.Builder() .index("*") .docs(true) // 开启文档统计 .store(true) // 开启存储统计 .build(); // 异步获取统计响应 Mono<IndicesStatsResponse> statsResponseMono = indicesClient.stats(statsRequest); IndicesStatsResponse statsResponse = statsResponseMono.block();
2. 解析统计数据
从IndicesStatsResponse中提取每个索引的目标数据:
// 遍历所有索引的统计信息 statsResponse.indices().forEach((indexName, indexStats) -> { long documentCount = indexStats.docs().count(); // 文档总数 long indexSizeInBytes = indexStats.store().sizeInBytes(); // 索引存储大小(字节) // 可按需转换单位,比如转成MB:indexSizeInBytes / (1024 * 1024) System.out.printf("索引: %s, 文档数: %d, 大小: %d bytes%n", indexName, documentCount, indexSizeInBytes); });
3. 整合所有所需信息
结合你已有的GetIndexResponse数据,将索引名称、创建时间、别名与统计数据合并:
// 先获取索引元数据 Mono<GetIndexResponse> metaResponseMono = indicesClient.get(new GetIndexRequest.Builder().index("*").build()); GetIndexResponse metaResponse = metaResponseMono.block(); // 合并元数据与统计数据 metaResponse.result().forEach((indexName, indexMeta) -> { // 基础元数据提取 String name = indexName; long creationTime = Long.parseLong(indexMeta.settings().get("index.created_time")); // 创建时间戳 List<String> aliases = indexMeta.aliases().keySet().stream().toList(); // 索引别名 // 统计数据提取 IndexStats indexStats = statsResponse.indices().get(indexName); long documentCount = indexStats.docs().count(); long indexSizeInBytes = indexStats.store().sizeInBytes(); // 输出完整信息 System.out.printf( "索引名称: %s, 创建时间: %d, 别名: %s, 文档数: %d, 大小: %d bytes%n", name, creationTime, aliases, documentCount, indexSizeInBytes ); });
关键说明
IndicesStatsRequest支持通过docs()、store()等方法精准筛选统计指标,避免返回冗余数据;- 索引创建时间存储在
index.created_time配置项中,需要从indexMeta.settings()提取并转换为长整型时间戳; - 若遵循响应式编程规范,可使用
flatMap等操作符组合元数据请求与统计请求,避免调用block()阻塞线程。
内容的提问来源于stack exchange,提问作者User1254
相关产品推荐
相关产品推荐

