欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

java elasticsearch使用總結(jié)與注意事項

 更新時間:2025年08月07日 11:54:54   作者:leijmdas  
本文系統(tǒng)梳理Java操作Elasticsearch核心流程,涵蓋環(huán)境配置、CRUD操作、搜索聚合、批量處理及安全實踐,強(qiáng)調(diào)版本適配(7.x用RestHighLevelClient,8.x+用elasticsearch-java),并提供性能優(yōu)化要點與官方文檔參考,感興趣的朋友一起看看吧

以下是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。
  • 性能關(guān)鍵點
    • 批量操作:優(yōu)先使用 BulkRequest 減少網(wǎng)絡(luò)開銷。
    • 連接池:高并發(fā)場景調(diào)整 MaxConnTotalMaxConnPerRoute。
    • 超時設(shè)置:避免因網(wǎng)絡(luò)波動導(dǎo)致線程阻塞。
  • 生產(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)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • MyBatis-Plus?ORM數(shù)據(jù)庫和實體類映射方式

    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集合的踩坑記錄

    這篇文章主要介紹了基于@Valid和@Validated驗證List集合的踩坑記錄,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • Spring源碼解密之自定義標(biāo)簽與解析

    Spring源碼解密之自定義標(biāo)簽與解析

    這篇文章主要給大家介紹了關(guān)于Spring源碼解密之自定義標(biāo)簽與解析的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-01-01
  • 詳細(xì)解讀JAVA多線程實現(xiàn)的三種方式

    詳細(xì)解讀JAVA多線程實現(xiàn)的三種方式

    本篇文章主要介紹了詳細(xì)解讀JAVA多線程實現(xiàn)的三種方式,主要包括繼承Thread類、實現(xiàn)Runnable接口、使用ExecutorService、Callable、Future實現(xiàn)有返回結(jié)果的多線程。有需要的可以了解一下。
    2016-11-11
  • SpringCloud之Feign遠(yuǎn)程接口映射的實現(xiàn)

    SpringCloud之Feign遠(yuǎn)程接口映射的實現(xiàn)

    這篇文章主要介紹了SpringCloud之Feign遠(yuǎn)程接口映射的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • Spring中@Value設(shè)置默認(rèn)值問題解決

    Spring中@Value設(shè)置默認(rèn)值問題解決

    本文主要介紹了Spring中@Value設(shè)置默認(rèn)值問題解決,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • 手把手教你使用Java實現(xiàn)在線生成pdf文檔

    手把手教你使用Java實現(xiàn)在線生成pdf文檔

    在實際的業(yè)務(wù)開發(fā)的時候,常常會需要把相關(guān)的數(shù)據(jù)信息,通過一些技術(shù)手段生成對應(yīng)的PDF文件,然后返回給用戶。本文將手把手教大家如何利用Java實現(xiàn)在線生成pdf文檔,需要的可以參考一下
    2022-03-03
  • 使用java編寫一個字符串詞頻統(tǒng)計工具

    使用java編寫一個字符串詞頻統(tǒng)計工具

    許多培訓(xùn)機(jī)構(gòu)都會出幾本高頻詞匯的書,主要內(nèi)容是統(tǒng)計近幾年來各類考試中屢次出現(xiàn)的高頻詞匯,幫助考生減少需要背的生詞的數(shù)量,下面我們來看看如何使用java編寫一個字符串詞頻統(tǒng)計工具吧
    2025-06-06
  • UniApp?+?SpringBoot?實現(xiàn)支付寶支付和退款功能

    UniApp?+?SpringBoot?實現(xiàn)支付寶支付和退款功能

    這篇文章主要介紹了UniApp?+?SpringBoot?實現(xiàn)支付寶支付和退款功能,基本的?SpringBoot?的腳手架,可以去IDEA?自帶的快速生成腳手架插件,本文通過實例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2022-06-06
  • 解讀easyexcel中的常用注解

    解讀easyexcel中的常用注解

    這篇文章主要介紹了關(guān)于easyexcel中的常用注解,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-04-04

最新評論