java elasticsearch使用總結(jié)與注意事項(xiàng)
以下是Java操作Elasticsearch的核心流程及代碼示例,結(jié)合官方推薦實(shí)踐和最新版本(8.x)整理而成:
??? 一、環(huán)境準(zhǔn)備與客戶端連接
添加依賴
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版本需匹配。
初始化客戶端
// 創(chuàng)建低級(jí)REST客戶端
RestClient restClient = RestClient.builder(new HttpHost("localhost", 9200)).build();
// 構(gòu)建傳輸層(JSON序列化)
ElasticsearchTransport transport = new RestClientTransport(restClient, new JacksonJsonpMapper());
// 創(chuàng)建類型安全API客戶端
ElasticsearchClient client = new ElasticsearchClient(transport);支持集群多節(jié)點(diǎn)、HTTPS及認(rèn)證。
?? 二、基礎(chǔ)CRUD操作
創(chuàng)建索引與映射
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"));
?? 三、高級(jí)搜索與聚合
布爾查詢
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("平均價(jià)格:" + stats.avg());
高亮搜索結(jié)果
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);
? 四、批量操作與性能優(yōu)化
批量寫(xiě)入文檔
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());
批量減少網(wǎng)絡(luò)開(kāi)銷,提升寫(xiě)入效率。
客戶端調(diào)優(yōu)
RestClientBuilder builder = RestClient.builder(new HttpHost("es1", 9200))
.setRequestConfigCallback(config -> config
.setConnectTimeout(5000) // 連接超時(shí)5秒
.setSocketTimeout(60000)); // 響應(yīng)超時(shí)60秒
調(diào)整超時(shí)、重試策略和連接池。
?? 五、安全與生產(chǎn)實(shí)踐
認(rèn)證配置
CredentialsProvider provider = new BasicCredentialsProvider();
provider.setCredentials(AuthScope.ANY,
new UsernamePasswordCredentials("user", "password"));
RestClientBuilder builder = RestClient.builder(...)
.setHttpClientConfigCallback(c -> c.setDefaultCredentialsProvider(provider));
支持TLS加密傳輸。
災(zāi)備與集群
客戶端配置多個(gè)節(jié)點(diǎn)實(shí)現(xiàn)負(fù)載均衡:
new HttpHost("es1", 9200), new HttpHost("es2", 9200)
定期監(jiān)控集群健康狀態(tài)(client.cluster().health())。
?? 總結(jié)
- 版本選擇:ES 8.x+用
elasticsearch-java客戶端,7.x用RestHighLevelClient。 - 核心操作:通過(guò)類型安全的Builder API實(shí)現(xiàn)CRUD、搜索、聚合,減少手動(dòng)拼寫(xiě)JSON的錯(cuò)誤。
- 性能關(guān)鍵:批量操作 > 客戶端調(diào)優(yōu) > 合理分片設(shè)計(jì)。
完整代碼示例參考:Elasticsearch Java Client官方文檔 | 實(shí)戰(zhàn)案例:Spring Boot集成ES。
以下是針對(duì) Java 操作 Elasticsearch 7.x 版本的完整使用指南,結(jié)合官方推薦實(shí)踐和關(guān)鍵代碼示例整理而成。重點(diǎn)涵蓋環(huán)境配置、核心 API 及性能優(yōu)化技巧,適用于生產(chǎn)環(huán)境開(kāi)發(fā)。
?? 一、環(huán)境配置與客戶端連接
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服務(wù)版本一致 -->
</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"))
);
}
}集群配置:支持多節(jié)點(diǎn) new HttpHost("node1", 9200), new HttpHost("node2", 9200)
認(rèn)證配置:
CredentialsProvider provider = new BasicCredentialsProvider();
provider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials("user", "pass"));
RestClientBuilder builder = RestClient.builder(...)
.setHttpClientConfigCallback(c -> c.setDefaultCredentialsProvider(provider));
?? 二、索引管理
創(chuàng)建索引(含映射與設(shè)置)
CreateIndexRequest request = new CreateIndexRequest("products");
// 設(shè)置分片與副本
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);
高級(jí)技巧:使用 XContentBuilder 動(dòng)態(tài)生成映射。
?? 三、文檔操作
新增/替換文檔
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);
自動(dòng)生成 ID:省略 .id() 方法
查詢文檔
GetRequest request = new GetRequest("products", "101");
GetResponse response = client.get(request, RequestOptions.DEFAULT);
String source = response.getSourceAsString(); // 獲取JSON格式數(shù)據(jù)
更新文檔
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);
// 遍歷結(jié)果
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)); // 過(guò)濾條件
sourceBuilder.query(boolQuery);
? 五、批量操作與性能優(yōu)化
批量寫(xiě)入(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() 處理失敗項(xiàng)。
客戶端調(diào)優(yōu)
RestClientBuilder builder = RestClient.builder(new HttpHost("localhost", 9200))
.setRequestConfigCallback(config -> config
.setConnectTimeout(5000) // 連接超時(shí)5秒
.setSocketTimeout(60000)) // 響應(yīng)超時(shí)60秒
.setHttpClientConfigCallback(c -> c
.setMaxConnTotal(500) // 最大連接數(shù)
.setMaxConnPerRoute(300)); // 單路由最大連接數(shù)
?? 總結(jié)與注意事項(xiàng)
- 版本兼容性
- Elasticsearch 服務(wù)端與
RestHighLevelClient版本需嚴(yán)格一致(如 7.15.2 客戶端配 7.15.x 服務(wù)端)。 - 升級(jí)到 ES 8.x 需改用新客戶端
co.elastic.clients:elasticsearch-java。
- Elasticsearch 服務(wù)端與
- 性能關(guān)鍵點(diǎn)
- 批量操作:優(yōu)先使用
BulkRequest減少網(wǎng)絡(luò)開(kāi)銷。 - 連接池:高并發(fā)場(chǎng)景調(diào)整
MaxConnTotal和MaxConnPerRoute。 - 超時(shí)設(shè)置:避免因網(wǎng)絡(luò)波動(dòng)導(dǎo)致線程阻塞。
- 批量操作:優(yōu)先使用
- 生產(chǎn)建議
- 索引設(shè)計(jì):預(yù)定義映射(Mapping)避免動(dòng)態(tài)推斷類型不一致。
- 安全關(guān)閉:
finally塊中調(diào)用client.close()釋放資源。
完整代碼參考:Elasticsearch 7.17 官方示例 | 阿里云集群配置指南
到此這篇關(guān)于java elasticsearch使用的文章就介紹到這了,更多相關(guān)java elasticsearch使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- java操作ElasticSearch聚合查詢的示例代碼
- Java查詢Elasticsearch數(shù)據(jù)根據(jù)指定id檢索(in查詢)、sql權(quán)限過(guò)濾、多字段匹配檢索及數(shù)據(jù)排序
- 一文詳解各種ElasticSearch查詢?cè)贘ava中的實(shí)現(xiàn)
- java向es中寫(xiě)入數(shù)據(jù)報(bào)錯(cuò)org.elasticsearch.action.ActionReque問(wèn)題
- Java使用ES?Client?調(diào)用滾動(dòng)查詢及Elasticsearch滾動(dòng)查詢Scrolling機(jī)制
- Java利用ElasticSearch實(shí)現(xiàn)增刪改功能
- Java利用ElasticSearch實(shí)現(xiàn)自動(dòng)補(bǔ)全功能
- Java+ElasticSearch+Pytorch實(shí)現(xiàn)以圖搜圖功能
- java操作elasticsearch詳細(xì)方法總結(jié)
相關(guān)文章
Springboot jpa @Column命名大小寫(xiě)問(wèn)題及解決
這篇文章主要介紹了Springboot jpa @Column命名大小寫(xiě)問(wèn)題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10
springboot實(shí)現(xiàn)配置兩個(gè)parent的方法
這篇文章主要介紹了springboot實(shí)現(xiàn)配置兩個(gè)parent的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12
java實(shí)現(xiàn)人員信息管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)人員信息管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02
簡(jiǎn)單了解JAVA內(nèi)存區(qū)域效果知識(shí)
這篇文章主要介紹了簡(jiǎn)單了解JAVA內(nèi)存區(qū)域效果知識(shí),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-10-10
SpringBoot中的@ConfigurationProperties注解解析
這篇文章主要介紹了SpringBoot中的@ConfigurationProperties注解解析,Spring源碼中大量使用了ConfigurationProperties注解,通過(guò)與其他注解配合使用,能夠?qū)崿F(xiàn)Bean的按需配置,該注解可以放在類上,也可以放在方法上,需要的朋友可以參考下2023-11-11
Java BigDecimal詳解_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
BigDecimal 由任意精度的整數(shù)非標(biāo)度值 和32 位的整數(shù)標(biāo)度 (scale) 組成。接下來(lái)通過(guò)本文給大家介紹Java BigDecimal詳解,需要的的朋友參考下吧2017-04-04
Java 格式化輸出JSON字符串的2種實(shí)現(xiàn)操作
這篇文章主要介紹了Java 格式化輸出JSON字符串的2種實(shí)現(xiàn)操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-10-10
如果淘寶的七天自動(dòng)確認(rèn)收貨讓你設(shè)計(jì)你用Java怎么實(shí)現(xiàn)
在面試的時(shí)候如果面試官問(wèn)淘寶的七天自動(dòng)確認(rèn)收貨讓你設(shè)計(jì),你會(huì)怎么具體實(shí)現(xiàn)呢?跟著小編看一下下邊的實(shí)現(xiàn)過(guò)程,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值2021-09-09
Java8函數(shù)式接口java.util.function速查大全
因?yàn)镴ava8引入了函數(shù)式接口,在java.util.function包含了幾大類函數(shù)式接口聲明,這篇文章主要給大家介紹了關(guān)于Java8函數(shù)式接口java.util.function速查的相關(guān)資料,需要的朋友可以參考下2021-08-08

