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

