java elasticsearch使用总结与注意事项
作者:leijmdas
以下是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。
- Elasticsearch 服务端与
- 性能关键点
- 批量操作:优先使用
BulkRequest减少网络开销。 - 连接池:高并发场景调整
MaxConnTotal和MaxConnPerRoute。 - 超时设置:避免因网络波动导致线程阻塞。
- 批量操作:优先使用
- 生产建议
- 索引设计:预定义映射(Mapping)避免动态推断类型不一致。
- 安全关闭:
finally块中调用client.close()释放资源。
完整代码参考:Elasticsearch 7.17 官方示例 | 阿里云集群配置指南
到此这篇关于java elasticsearch使用的文章就介绍到这了,更多相关java elasticsearch使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
您可能感兴趣的文章:
- java操作ElasticSearch聚合查询的示例代码
- Java查询Elasticsearch数据根据指定id检索(in查询)、sql权限过滤、多字段匹配检索及数据排序
- 一文详解各种ElasticSearch查询在Java中的实现
- java向es中写入数据报错org.elasticsearch.action.ActionReque问题
- Java使用ES Client 调用滚动查询及Elasticsearch滚动查询Scrolling机制
- Java利用ElasticSearch实现增删改功能
- Java利用ElasticSearch实现自动补全功能
- Java+ElasticSearch+Pytorch实现以图搜图功能
- java操作elasticsearch详细方法总结
