java elasticsearch使用總結(jié)與注意事項
以下是Java操作Elasticsearch的核心流程及代碼示例,結(jié)合官方推薦實踐和最新版本(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)建低級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é)點、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"));
?? 三、高級搜索與聚合
布爾查詢
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());
高亮搜索結(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)化
批量寫入文檔
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ò)開銷,提升寫入效率。
客戶端調(diào)優(yōu)
RestClientBuilder builder = RestClient.builder(new HttpHost("es1", 9200)) .setRequestConfigCallback(config -> config .setConnectTimeout(5000) // 連接超時5秒 .setSocketTimeout(60000)); // 響應(yīng)超時60秒
調(diào)整超時、重試策略和連接池。
?? 五、安全與生產(chǎn)實踐
認(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)備與集群
客戶端配置多個節(jié)點實現(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
。 - 核心操作:通過類型安全的Builder API實現(xiàn)CRUD、搜索、聚合,減少手動拼寫JSON的錯誤。
- 性能關(guān)鍵:批量操作 > 客戶端調(diào)優(yōu) > 合理分片設(shè)計。
完整代碼示例參考:Elasticsearch Java Client官方文檔 | 實戰(zhàn)案例:Spring Boot集成ES。
以下是針對 Java 操作 Elasticsearch 7.x 版本的完整使用指南,結(jié)合官方推薦實踐和關(guān)鍵代碼示例整理而成。重點涵蓋環(huán)境配置、核心 API 及性能優(yōu)化技巧,適用于生產(chǎn)環(huán)境開發(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é)點 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);
高級技巧:使用 XContentBuilder
動態(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);
自動生成 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)); // 過濾條件 sourceBuilder.query(boolQuery);
? 五、批量操作與性能優(yōu)化
批量寫入(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()
處理失敗項。
客戶端調(diào)優(yōu)
RestClientBuilder builder = RestClient.builder(new HttpHost("localhost", 9200)) .setRequestConfigCallback(config -> config .setConnectTimeout(5000) // 連接超時5秒 .setSocketTimeout(60000)) // 響應(yīng)超時60秒 .setHttpClientConfigCallback(c -> c .setMaxConnTotal(500) // 最大連接數(shù) .setMaxConnPerRoute(300)); // 單路由最大連接數(shù)
?? 總結(jié)與注意事項
- 版本兼容性
- Elasticsearch 服務(wù)端與
RestHighLevelClient
版本需嚴(yán)格一致(如 7.15.2 客戶端配 7.15.x 服務(wù)端)。 - 升級到 ES 8.x 需改用新客戶端
co.elastic.clients:elasticsearch-java
。
- Elasticsearch 服務(wù)端與
- 性能關(guān)鍵點
- 批量操作:優(yōu)先使用
BulkRequest
減少網(wǎng)絡(luò)開銷。 - 連接池:高并發(fā)場景調(diào)整
MaxConnTotal
和MaxConnPerRoute
。 - 超時設(shè)置:避免因網(wǎng)絡(luò)波動導(dǎo)致線程阻塞。
- 批量操作:優(yōu)先使用
- 生產(chǎn)建議
- 索引設(shè)計:預(yù)定義映射(Mapping)避免動態(tài)推斷類型不一致。
- 安全關(guān)閉:
finally
塊中調(diào)用client.close()
釋放資源。
完整代碼參考:Elasticsearch 7.17 官方示例 | 阿里云集群配置指南
到此這篇關(guān)于java elasticsearch使用的文章就介紹到這了,更多相關(guān)java elasticsearch使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- java操作ElasticSearch聚合查詢的示例代碼
- Java查詢Elasticsearch數(shù)據(jù)根據(jù)指定id檢索(in查詢)、sql權(quán)限過濾、多字段匹配檢索及數(shù)據(jù)排序
- 一文詳解各種ElasticSearch查詢在Java中的實現(xiàn)
- java向es中寫入數(shù)據(jù)報錯org.elasticsearch.action.ActionReque問題
- Java使用ES?Client?調(diào)用滾動查詢及Elasticsearch滾動查詢Scrolling機(jī)制
- Java利用ElasticSearch實現(xiàn)增刪改功能
- Java利用ElasticSearch實現(xiàn)自動補(bǔ)全功能
- Java+ElasticSearch+Pytorch實現(xiàn)以圖搜圖功能
- java操作elasticsearch詳細(xì)方法總結(jié)
相關(guān)文章
MyBatis-Plus?ORM數(shù)據(jù)庫和實體類映射方式
本文詳細(xì)介紹了MyBatis-Plus(MP)在數(shù)據(jù)庫和Java對象映射方面的功能,包括基本映射、主鍵生成策略、復(fù)雜映射(如嵌套對象和集合類型)以及自定義SQL的使用,MP通過豐富的注解和XML配置,簡化了數(shù)據(jù)庫操作,提高了開發(fā)效率2025-01-01基于@Valid和@Validated驗證List集合的踩坑記錄
這篇文章主要介紹了基于@Valid和@Validated驗證List集合的踩坑記錄,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-07-07SpringCloud之Feign遠(yuǎn)程接口映射的實現(xiàn)
這篇文章主要介紹了SpringCloud之Feign遠(yuǎn)程接口映射的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09Spring中@Value設(shè)置默認(rèn)值問題解決
本文主要介紹了Spring中@Value設(shè)置默認(rèn)值問題解決,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07UniApp?+?SpringBoot?實現(xiàn)支付寶支付和退款功能
這篇文章主要介紹了UniApp?+?SpringBoot?實現(xiàn)支付寶支付和退款功能,基本的?SpringBoot?的腳手架,可以去IDEA?自帶的快速生成腳手架插件,本文通過實例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧2022-06-06