讲师中心 微信公众号
AI工具推荐 视频效率加速

Elasticsearch Java API:在单次请求中实现多聚合查询

夜辰吖_9926

夜辰吖_9926

发布时间:2025-11-20 20:40:38

|

658人浏览过

|

来源于php中文网

原创

Elasticsearch Java API:在单次请求中实现多聚合查询

本教程详细指导如何将包含`match_all`查询和多个聚合(如`min`和`max`)的elasticsearch json查询转换为等效的java api。我们将重点展示如何利用`searchsourcebuilder`将多个`aggregationbuilder`组合成一个单一的搜索请求,从而避免多次api调用,提高查询效率和代码简洁性。

1. 理解Elasticsearch JSON查询结构

在Elasticsearch中,一个典型的搜索请求JSON体通常包含以下几个核心部分:

  • size: 控制返回的文档数量。当只关心聚合结果时,通常设置为0以节省网络带宽和处理资源。
  • query: 定义搜索条件,例如match_all表示匹配所有文档。
  • aggs (aggregations): 定义聚合操作,用于对数据进行统计分析。本例中包含min和max两种聚合,分别用于查找指定字段的最小值和最大值。

给定的JSON查询示例如下:

{
  "size": 0,
  "query": {
    "match_all": {}
  },
  "aggs": {
    "min": {
      "min": {
        "field": "<The date>"
      }
    },
    "max":{
      "max": {
        "field": "<The date>"
      }
    }
  }
}

这个查询的目标是获取所有文档中指定日期字段的最小值和最大值,同时不返回任何文档。

2. Elasticsearch Java API核心组件介绍

要使用Java API构建并执行上述查询,我们需要了解几个关键类:

立即学习“Java免费学习笔记(深入)”;

  • SearchSourceBuilder: 核心构建器,用于构建搜索请求的JSON体。它允许你设置查询、聚合、排序、分页等所有搜索相关的参数。
  • QueryBuilders: 辅助类,提供各种查询类型的静态工厂方法,例如matchAllQuery()、termQuery()等。
  • AggregationBuilders: 辅助类,提供各种聚合类型的静态工厂方法,例如min()、max()、terms()等。
  • SearchRequest: 封装了要发送到Elasticsearch的完整搜索请求,包含索引名称和SearchSourceBuilder构建的源。
  • SearchResponse: 包含Elasticsearch返回的搜索结果,包括文档和聚合结果。
  • RestHighLevelClient: Elasticsearch官方推荐的高级REST客户端,用于与Elasticsearch集群进行交互。

3. 构建包含多聚合的Java API请求

用户常遇到的一个误区是,认为每个AggregationBuilder的调用都需要单独的API请求。实际上,AggregationBuilder只是构建聚合定义的语句,它们会被添加到同一个SearchSourceBuilder中,最终通过一次client.search()调用发送给Elasticsearch。

Java Maven Common
Java Maven Common

Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。

下载

以下是实现上述JSON查询的Java API步骤:

3.1 初始化SearchSourceBuilder并设置查询及大小

首先,创建一个SearchSourceBuilder实例,并设置match_all查询和size为0。

import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.index.query.QueryBuilders;

SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
// 设置查询条件为匹配所有文档
searchSourceBuilder.query(QueryBuilders.matchAllQuery());
// 设置返回文档数量为0,因为我们只关心聚合结果
searchSourceBuilder.size(0);

3.2 添加多个聚合操作

接下来,使用AggregationBuilders为日期字段添加min和max聚合。注意,这两个聚合都通过searchSourceBuilder.aggregation()方法添加到同一个SearchSourceBuilder实例中。

import org.elasticsearch.search.aggregations.AggregationBuilders;
import org.elasticsearch.search.aggregations.metrics.MaxAggregationBuilder;
import org.elasticsearch.search.aggregations.metrics.MinAggregationBuilder;

// 定义Min聚合,别名为"min",作用于"date"字段
MinAggregationBuilder minAggregation = AggregationBuilders.min("min").field("date");
searchSourceBuilder.aggregation(minAggregation);

// 定义Max聚合,别名为"max",作用于"date"字段
MaxAggregationBuilder maxAggregation = AggregationBuilders.max("max").field("date");
searchSourceBuilder.aggregation(maxAggregation);

注意:在原始问题中,用户在尝试MinAggregationBuilder时错误地使用了AggregationBuilders.max("min").field("date")。正确的做法是使用AggregationBuilders.min("min").field("date")。上述代码已修正此错误。

3.3 封装并执行搜索请求

将构建好的SearchSourceBuilder放入SearchRequest中,并指定要查询的索引。最后,通过RestHighLevelClient执行请求。

import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.action.search.SearchResponse;

// 假设您已经初始化了RestHighLevelClient实例
// RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(new HttpHost("localhost", 9200, "http")));

SearchRequest searchRequest = new SearchRequest("your_index_name"); // 替换为您的实际索引名称
searchRequest.source(searchSourceBuilder);

// 执行API调用
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);

4. 完整Java API示例代码

将以上片段组合起来,形成一个完整的Java API调用示例:

import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.common.unit.TimeValue;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.aggregations.AggregationBuilders;
import org.elasticsearch.search.aggregations.metrics.Max;
import org.elasticsearch.search.aggregations.metrics.Min;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.apache.http.HttpHost;

import java.io.IOException;
import java.util.concurrent.TimeUnit;

public class ElasticsearchMultiAggregationTutorial {

    public static void main(String[] args) throws IOException {
        // 1. 初始化RestHighLevelClient
        // 实际应用中,请确保客户端是单例并妥善管理其生命周期
        RestHighLevelClient client = new RestHighLevelClient(
                RestClient.builder(
                        new HttpHost("localhost", 9200, "http")));

        try {
            // 2. 构建SearchSourceBuilder
            SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();

            // 设置查询条件:匹配所有文档
            searchSourceBuilder.query(QueryBuilders.matchAllQuery());

            // 设置返回文档数量为0,因为我们只关心聚合结果
            searchSourceBuilder.size(0);

            // 设置超时时间(可选)
            searchSourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));

            // 3. 添加多个聚合操作
            // 添加Min聚合,别名为"min",作用于"date"字段
            searchSourceBuilder.aggregation(AggregationBuilders.min("min").field("date"));

            // 添加Max聚合,别名为"max",作用于"date"字段
            searchSourceBuilder.aggregation(AggregationBuilders.max("max").field("date"));

            // 4. 封装SearchRequest
            SearchRequest searchRequest = new SearchRequest("your_index_name"); // 替换为您的实际索引名称
            searchRequest.source(searchSourceBuilder);

            System.out.println("Generated Elasticsearch Query JSON:");
            System.out.println(searchSourceBuilder.toString()); // 打印生成的JSON,方便调试

            // 5. 执行API调用
            SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);

            // 6. 处理聚合结果
            // 获取Min聚合结果
            Min minAggregation = searchResponse.getAggregations().get("min");
            double minValue = minAggregation.getValue();
            System.out.println("Min date value: " + minValue); // 对于日期字段,通常需要进一步格式化

            // 获取Max聚合结果
            Max maxAggregation = searchResponse.getAggregations().get("max");
            double maxValue = maxAggregation.getValue();
            System.out.println("Max date value: " + maxValue); // 对于日期字段,通常需要进一步格式化

        } catch (IOException e) {
            System.err.println("Error during Elasticsearch search: " + e.getMessage());
            e.printStackTrace();
        } finally {
            // 7. 关闭RestHighLevelClient
            try {
                if (client != null) {
                    client.close();
                }
            } catch (IOException e) {
                System.err.println("Error closing Elasticsearch client: " + e.getMessage());
            }
        }
    }
}

5. 注意事项与总结

  • 单次API调用: 核心在于理解SearchSourceBuilder是一个容器,所有查询和聚合的定义都可以在其中构建,最终通过一次client.search()发送,这显著提高了效率。
  • 聚合结果提取: SearchResponse中包含了聚合结果。通过searchResponse.getAggregations().get("your_agg_name")可以获取到对应的聚合对象,然后根据聚合类型(如Min、Max、Terms等)进行类型转换并提取值。
  • 字段类型: 示例中"date"字段的聚合结果是double类型,这是因为Elasticsearch在内部处理日期时常将其转换为毫秒时间戳。在实际应用中,您可能需要将这个double值转换回java.util.Date或java.time.Instant等日期对象进行展示。
  • 客户端管理: RestHighLevelClient是重量级对象,应在应用程序生命周期中作为单例进行管理,并在应用程序关闭时正确关闭以释放资源。
  • 错误处理: 在实际生产代码中,应包含更健壮的错误处理机制,例如重试逻辑、熔断器等。

热门AI工具

更多
豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

2155

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

3302

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

1116

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

3779

2025.09.10

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

4048

2025.08.29

C++中int、float和double的区别
C++中int、float和double的区别

本专题整合了c++中int和double的区别,阅读专题下面的文章了解更多详细内容。

764

2025.10.23

C++类型转换方式
C++类型转换方式

本专题整合了C++类型转换相关内容,想了解更多相关内容,请阅读专题下面的文章。

2342

2025.07.15

Elasticsearch 从入门到搜索引擎实战
Elasticsearch 从入门到搜索引擎实战

本专题带你从零掌握 Elasticsearch 分布式搜索引擎。深入解析倒排索引核心原理,涵盖单机与 Docker 环境搭建、IK 中文分词器配置及索引文档的 CRUD 操作。通过丰富的 Query DSL 实战案例,详解布尔查询、聚合分析与高亮显示,助你快速构建毫秒级响应的企业级高性能搜索服务。

39

2026.05.12

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

0

2026.10.22

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn