0

0

如何加速从 Elasticsearch 多索引中获取唯一值?

碧海醫心

碧海醫心

发布时间:2026-01-09 14:49:01

|

529人浏览过

|

来源于php中文网

原创

如何加速从 Elasticsearch 多索引中获取唯一值?

通过单次跨索引聚合(terms on `_index` + 子聚合 on `provider.keyword`),替代逐索引循环查询,可显著提升多索引去重查询性能。

在 Elasticsearch 中,当需要从上百个索引中提取某个字段(如 provider.keyword)的所有唯一值时,若采用“遍历每个索引 → 单独执行 terms 聚合 → 合并结果”的方式(即原始代码中的 for 循环),不仅会产生大量 HTTP 请求和网络开销,还会因重复初始化搜索上下文、分片协调及结果归并而严重拖慢响应速度。

更优解:使用跨索引聚合 + 嵌套聚合(Multi-level Aggregation)

Elasticsearch 支持对多个索引(甚至通配符或 _all)一次性执行聚合操作。关键优化点如下:

  • ✅ 使用 indices("_all") 或通配符索引名(如 "logs-*")发起单次请求,避免 N 次 round-trip;
  • ✅ 设置 .size(0) 禁用 hits 返回,仅关注聚合结果,减少序列化与传输开销;
  • ✅ 构建两级 terms 聚合:外层按 _index 分桶(便于后续区分来源),内层按 provider.keyword 分桶并自动去重;
  • ✅ 为两级聚合显式设置足够大的 .size()(如 100),防止高频值被截断(注意:ES 默认仅返回前 10 个 terms,需主动扩容)。

示例优化代码(Java High-Level REST Client):

Ink For All
Ink For All

AI写作和营销助手,精心设计的 UI

下载
SearchRequest searchRequest = new SearchRequest();
searchRequest.indices("_all"); // 或更安全的 getIndicesPattern(),如 "myapp-202*-*" 

SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(QueryBuilders.matchAllQuery()).size(0); // 关键:不返回文档内容

String aggregationIndexName = "by_index";
String aggregationProviderName = "by_provider";

searchSourceBuilder.aggregation(
    AggregationBuilders.terms(aggregationIndexName)
        .field("_index")
        .size(100) // 确保覆盖全部索引(索引数 ≤ 100)
        .subAggregation(
            AggregationBuilders.terms(aggregationProviderName)
                .field("provider.keyword")
                .size(1000) // 根据业务预估 provider 去重后数量,建议 ≥ 实际唯一值量级
        )
);

searchRequest.source(searchSourceBuilder);

SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);

解析聚合结果(提取全部唯一 provider 值):

Terms indicesAgg = response.getAggregations().get(aggregationIndexName);
Set allUniqueProviders = new HashSet<>();

for (Terms.Bucket indexBucket : indicesAgg.getBuckets()) {
    Terms providerAgg = indexBucket.getAggregations().get(aggregationProviderName);
    for (Terms.Bucket providerBucket : providerAgg.getBuckets()) {
        allUniqueProviders.add(providerBucket.getKeyAsString());
    }
}
// allUniqueProviders 即为全量去重后的 provider 列表

⚠️ 注意事项:

  • _all 在 ES 7.x+ 已弃用,生产环境推荐显式传入索引列表(如 client.indices().getAlias(...) 动态获取)或使用索引别名;
  • 若 provider.keyword 字段存在大量唯一值(>10k),需考虑启用 collect_mode: breadth_first 或调整 execution_hint,但通常 size=1000 已满足多数场景;
  • 确保 provider.keyword 字段已正确定义为 keyword 类型(而非 text),否则无法用于精确聚合;
  • 高并发下建议添加超时控制(searchRequest.requestOptions().withTimeout(...))并捕获 ElasticsearchStatusException。

综上,将 N 次独立聚合收敛为 1 次嵌套聚合,是提升多索引唯一值提取性能最直接、最有效的方式——既降低集群负载,又大幅缩短端到端延迟。

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

831

2023.06.15

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

735

2023.07.05

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

733

2023.07.31

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

396

2023.08.01

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

398

2023.08.02

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

446

2023.08.02

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

430

2023.08.02

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

16925

2023.08.03

c++主流开发框架汇总
c++主流开发框架汇总

本专题整合了c++开发框架推荐,阅读专题下面的文章了解更多详细内容。

25

2026.01.09

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 2.4万人学习

C# 教程
C# 教程

共94课时 | 6.4万人学习

Java 教程
Java 教程

共578课时 | 44.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号