java elasticsearch使用总结与注意事项

 更新时间:2025年08月07日 11:54:54   作者:leijmdas  
本文系统梳理Java操作Elasticsearch核心流程,涵盖环境配置、CRUD操作、搜索聚合、批量处理及安全实践,强调版本适配(7.x用RestHighLevelClient,8.x+用elasticsearch-java),并提供性能优化要点与官方文档参考,感兴趣的朋友一起看看吧

以下是Java操作Elasticsearch的核心流程及代码示例,结合官方推荐实践和最新版本(8.x)整理而成:

🛠️ 一、环境准备与客户端连接

添加依赖

Maven配置(推荐8.x版本):

<dependency>
    <groupId>co.elastic.clients</groupId>
    <artifactId>elasticsearch-java</artifactId>
    <version>8.10.0</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.15.2</version>
</dependency>

注:JDK需11+,ES与JDK版本需匹配。

初始化客户端

// 创建低级REST客户端
RestClient restClient = RestClient.builder(new HttpHost("localhost", 9200)).build();
// 构建传输层(JSON序列化)
ElasticsearchTransport transport = new RestClientTransport(restClient, new JacksonJsonpMapper());
// 创建类型安全API客户端
ElasticsearchClient client = new ElasticsearchClient(transport);

支持集群多节点、HTTPS及认证。

📝 二、基础CRUD操作

创建索引与映射

CreateIndexRequest request = new CreateIndexRequest.Builder()
    .index("products")
    .mappings(m -> m
        .properties("name", p -> p.text(t -> t.analyzer("ik_max_word")))
        .properties("price", p -> p.float_())
    ).build();
client.indices().create(request);

mappings定义字段类型(如text/keyword/date)。

文档操作

新增/替换文档

Product product = new Product("1", "iPhone", 5999.0);
IndexRequest<Product> request = new IndexRequest.Builder<Product>()
    .index("products")
    .id(product.getId())
    .document(product)
    .build();
client.index(request);

查询文档

GetResponse<Product> response = client.get(g -> g
    .index("products")
    .id("1"), Product.class);
System.out.println(response.source());

更新文档

UpdateRequest<Product, Product> request = new UpdateRequest.Builder<Product, Product>()
    .index("products")
    .id("1")
    .doc(new Product(null, null, 5499.0)) // 局部更新
    .build();
client.update(request, Product.class);

删除文档

client.delete(d -> d.index("products").id("1"));

🔍 三、高级搜索与聚合

布尔查询

SearchResponse<Product> response = client.search(s -> s
    .index("products")
    .query(q -> q
        .bool(b -> b
            .must(m -> m.match(t -> t.field("name").query("iPhone")))
            .filter(f -> f.range(r -> r.field("price").gte(5000)))
        )
    ), Product.class);

聚合分析

SearchResponse<Void> aggResponse = client.search(s -> s
    .index("products")
    .size(0)  // 不返回原始文档
    .aggregations("price_stats", a -> a.stats(st -> st.field("price"))),
    Void.class);
StatsAggregate stats = aggResponse.aggregations().get("price_stats").stats();
System.out.println("平均价格:" + stats.avg());

高亮搜索结果

SearchResponse<Product> hlResponse = client.search(s -> s
    .index("products")
    .query(q -> q.match(m -> m.field("description").query("iPhone")))
    .highlight(h -> h.fields("description", f -> f.preTags("<em>").postTags("</em>"))),
    Product.class);

⚡ 四、批量操作与性能优化

批量写入文档

BulkRequest.Builder br = new BulkRequest.Builder();
products.forEach(p -> 
    br.operations(op -> op
        .index(idx -> idx.index("products").id(p.getId()).document(p))
    )
);
client.bulk(br.build());

批量减少网络开销,提升写入效率。

客户端调优

RestClientBuilder builder = RestClient.builder(new HttpHost("es1", 9200))
    .setRequestConfigCallback(config -> config
        .setConnectTimeout(5000)    // 连接超时5秒
        .setSocketTimeout(60000));   // 响应超时60秒

调整超时、重试策略和连接池。

🔒 五、安全与生产实践

认证配置

CredentialsProvider provider = new BasicCredentialsProvider();
provider.setCredentials(AuthScope.ANY, 
    new UsernamePasswordCredentials("user", "password"));
RestClientBuilder builder = RestClient.builder(...)
    .setHttpClientConfigCallback(c -> c.setDefaultCredentialsProvider(provider));

支持TLS加密传输。

灾备与集群

客户端配置多个节点实现负载均衡:

new HttpHost("es1", 9200), new HttpHost("es2", 9200)

定期监控集群健康状态(client.cluster().health())。

💎 总结

  • 版本选择:ES 8.x+用elasticsearch-java客户端,7.x用RestHighLevelClient
  • 核心操作:通过类型安全的Builder API实现CRUD、搜索、聚合,减少手动拼写JSON的错误。
  • 性能关键:批量操作 > 客户端调优 > 合理分片设计。

完整代码示例参考:Elasticsearch Java Client官方文档 | 实战案例:Spring Boot集成ES

以下是针对 Java 操作 Elasticsearch 7.x 版本的完整使用指南,结合官方推荐实践和关键代码示例整理而成。重点涵盖环境配置、核心 API 及性能优化技巧,适用于生产环境开发。

🔧 一、环境配置与客户端连接

Maven 依赖

<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>elasticsearch-rest-high-level-client</artifactId>
    <version>7.17.9</version> <!-- 可选 7.10.0~7.17.9,需与ES服务版本一致 -->
</dependency>

注意:Elasticsearch 7.x 使用 RestHighLevelClient,8.x+ 需改用 Elasticsearch Java Client

初始化客户端

import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.apache.http.HttpHost;
public class ESClient {
    public static RestHighLevelClient createClient() {
        return new RestHighLevelClient(
            RestClient.builder(new HttpHost("localhost", 9200, "http"))
        );
    }
}

集群配置:支持多节点 new HttpHost("node1", 9200), new HttpHost("node2", 9200)

认证配置

CredentialsProvider provider = new BasicCredentialsProvider();
provider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials("user", "pass"));
RestClientBuilder builder = RestClient.builder(...)
    .setHttpClientConfigCallback(c -> c.setDefaultCredentialsProvider(provider));

📂 二、索引管理

创建索引(含映射与设置)

CreateIndexRequest request = new CreateIndexRequest("products");
// 设置分片与副本
request.settings(Settings.builder()
    .put("index.number_of_shards", 3)
    .put("index.number_of_replicas", 2)
);
// 定义字段映射
request.mapping(
    "{\"properties\":{\"name\":{\"type\":\"text\"},\"price\":{\"type\":\"float\"}}}", 
    XContentType.JSON
);
CreateIndexResponse response = client.indices().create(request, RequestOptions.DEFAULT);

高级技巧:使用 XContentBuilder 动态生成映射。

📄 三、文档操作

新增/替换文档

IndexRequest request = new IndexRequest("products").id("101");
Map<String, Object> doc = new HashMap<>();
doc.put("name", "Laptop");
doc.put("price", 6500);
request.source(doc);
IndexResponse response = client.index(request, RequestOptions.DEFAULT);

自动生成 ID:省略 .id() 方法

查询文档

GetRequest request = new GetRequest("products", "101");
GetResponse response = client.get(request, RequestOptions.DEFAULT);
String source = response.getSourceAsString(); // 获取JSON格式数据

更新文档

UpdateRequest request = new UpdateRequest("products", "101");
request.doc("price", 6000); // 局部更新字段
UpdateResponse response = client.update(request, RequestOptions.DEFAULT);

删除文档

DeleteRequest request = new DeleteRequest("products", "101");
DeleteResponse response = client.delete(request, RequestOptions.DEFAULT);

🔍 四、搜索与查询

匹配查询(Match Query)

SearchRequest request = new SearchRequest("products");
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
sourceBuilder.query(QueryBuilders.matchQuery("name", "Laptop"));
request.source(sourceBuilder);
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
// 遍历结果
response.getHits().forEach(hit -> System.out.println(hit.getSourceAsMap()));

范围查询(Range Query)

sourceBuilder.query(QueryBuilders.rangeQuery("price").gte(5000).lte(10000));

布尔查询(组合条件)

BoolQueryBuilder boolQuery = QueryBuilders.boolQuery()
    .must(QueryBuilders.matchQuery("name", "Laptop"))  // 必须包含
    .filter(QueryBuilders.rangeQuery("price").gte(5000)); // 过滤条件
sourceBuilder.query(boolQuery);

⚡ 五、批量操作与性能优化

批量写入(Bulk API)

BulkRequest bulkRequest = new BulkRequest();
for (Product product : productList) {
    IndexRequest request = new IndexRequest("products")
        .id(product.getId())
        .source(convertToMap(product));
    bulkRequest.add(request);
}
BulkResponse response = client.bulk(bulkRequest, RequestOptions.DEFAULT);

注意:检查 response.hasFailures() 处理失败项。

客户端调优

RestClientBuilder builder = RestClient.builder(new HttpHost("localhost", 9200))
    .setRequestConfigCallback(config -> config
        .setConnectTimeout(5000)    // 连接超时5秒
        .setSocketTimeout(60000))   // 响应超时60秒
    .setHttpClientConfigCallback(c -> c
        .setMaxConnTotal(500)       // 最大连接数
        .setMaxConnPerRoute(300));  // 单路由最大连接数

💎 总结与注意事项

  • 版本兼容性
    • Elasticsearch 服务端与 RestHighLevelClient 版本需严格一致(如 7.15.2 客户端配 7.15.x 服务端)。
    • 升级到 ES 8.x 需改用新客户端 co.elastic.clients:elasticsearch-java
  • 性能关键点
    • 批量操作:优先使用 BulkRequest 减少网络开销。
    • 连接池:高并发场景调整 MaxConnTotalMaxConnPerRoute
    • 超时设置:避免因网络波动导致线程阻塞。
  • 生产建议
    • 索引设计:预定义映射(Mapping)避免动态推断类型不一致。
    • 安全关闭:finally 块中调用 client.close() 释放资源。

完整代码参考:Elasticsearch 7.17 官方示例 | 阿里云集群配置指南

到此这篇关于java elasticsearch使用的文章就介绍到这了,更多相关java elasticsearch使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • MyBatis-Plus ORM数据库和实体类映射方式

    MyBatis-Plus ORM数据库和实体类映射方式

    本文详细介绍了MyBatis-Plus(MP)在数据库和Java对象映射方面的功能,包括基本映射、主键生成策略、复杂映射(如嵌套对象和集合类型)以及自定义SQL的使用,MP通过丰富的注解和XML配置,简化了数据库操作,提高了开发效率
    2025-01-01
  • 基于@Valid和@Validated验证List集合的踩坑记录

    基于@Valid和@Validated验证List集合的踩坑记录

    这篇文章主要介绍了基于@Valid和@Validated验证List集合的踩坑记录,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • Spring源码解密之自定义标签与解析

    Spring源码解密之自定义标签与解析

    这篇文章主要给大家介绍了关于Spring源码解密之自定义标签与解析的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参借鉴,下面随着小编来一起学习学习吧。
    2018-01-01
  • 详细解读JAVA多线程实现的三种方式

    详细解读JAVA多线程实现的三种方式

    本篇文章主要介绍了详细解读JAVA多线程实现的三种方式,主要包括继承Thread类、实现Runnable接口、使用ExecutorService、Callable、Future实现有返回结果的多线程。有需要的可以了解一下。
    2016-11-11
  • SpringCloud之Feign远程接口映射的实现

    SpringCloud之Feign远程接口映射的实现

    这篇文章主要介绍了SpringCloud之Feign远程接口映射的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • Spring中@Value设置默认值问题解决

    Spring中@Value设置默认值问题解决

    本文主要介绍了Spring中@Value设置默认值问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • 手把手教你使用Java实现在线生成pdf文档

    手把手教你使用Java实现在线生成pdf文档

    在实际的业务开发的时候,常常会需要把相关的数据信息,通过一些技术手段生成对应的PDF文件,然后返回给用户。本文将手把手教大家如何利用Java实现在线生成pdf文档,需要的可以参考一下
    2022-03-03
  • 使用java编写一个字符串词频统计工具

    使用java编写一个字符串词频统计工具

    许多培训机构都会出几本高频词汇的书,主要内容是统计近几年来各类考试中屡次出现的高频词汇,帮助考生减少需要背的生词的数量,下面我们来看看如何使用java编写一个字符串词频统计工具吧
    2025-06-06
  • UniApp + SpringBoot 实现支付宝支付和退款功能

    UniApp + SpringBoot 实现支付宝支付和退款功能

    这篇文章主要介绍了UniApp + SpringBoot 实现支付宝支付和退款功能,基本的 SpringBoot 的脚手架,可以去IDEA 自带的快速生成脚手架插件,本文通过实例代码给大家介绍的非常详细,需要的朋友参考下吧
    2022-06-06
  • 解读easyexcel中的常用注解

    解读easyexcel中的常用注解

    这篇文章主要介绍了关于easyexcel中的常用注解,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-04-04

最新评论