java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > java elasticsearch使用

java elasticsearch使用总结与注意事项

作者: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())。

💎 总结

完整代码示例参考: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 7.17 官方示例 | 阿里云集群配置指南

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

您可能感兴趣的文章:
阅读全文