日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

Elasticsearch 8.X 最新 Java Api Client 完整代碼,可直接用于項目實戰(zhàn)

 銘毅天下 2024-10-24 發(fā)布于廣東

前言

在現(xiàn)代的搜索和分析應(yīng)用中,Elasticsearch 已經(jīng)成為不可或缺的組件。

隨著 Elasticsearch 8.X 的發(fā)布,其 Java 客戶端 API 也有了顯著的更新。

本文將基于完整的 Java 代碼,詳細(xì)介紹如何在工程中使用 Elasticsearch 8.X 的最新 Java API Client。

干貨 | Elasticsearch Java 客戶端演進(jìn)歷史和選型指南

通過替換示例代碼中的部分內(nèi)容,可以將其直接應(yīng)用于實際的項目開發(fā)中。

一、8.X 最新 Java API Client特性概覽

1. 強類型請求和響應(yīng)

    • 類型安全

    針對所有的 Elasticsearch API,客戶端都提供了強類型的請求和響應(yīng)對象,減少了運行時錯誤的可能性。

    • 自動完成支持

    強類型的設(shè)計使得 IDE 可以更好地提供代碼提示和自動完成,提高開發(fā)效率。

2. 同步和異步 API

    • 同步操作

    適用于需要按照順序執(zhí)行的操作,確保每個請求都在前一個請求完成后執(zhí)行。

    • 異步操作

    提供非阻塞的方式執(zhí)行 API 調(diào)用,適用于需要高并發(fā)或?qū)憫?yīng)時間敏感的應(yīng)用。

3. 流式構(gòu)建器和函數(shù)式編程模式

    • 流式接口

    使用鏈?zhǔn)秸{(diào)用方式,可以簡潔地構(gòu)建復(fù)雜的請求。

    • 函數(shù)式編程

    通過 Lambda 表達(dá)式,簡化代碼編寫,提高可讀性。

4. 無縫集成對象映射器

    • Jackson 支持

默認(rèn)使用 Jackson 作為 JSON 解析庫,方便將自定義的 Java 對象與 JSON 數(shù)據(jù)相互轉(zhuǎn)換。

    • JSON-B 支持

    也可以選擇使用任何實現(xiàn)了 JSON-B 標(biāo)準(zhǔn)的庫,滿足不同項目的需求。

5. 基于底層 REST 客戶端的協(xié)議處理

    • 協(xié)議抽象:

    將協(xié)議處理委托給底層的 HTTP 客戶端,如 Java Low Level REST Client。

    • 連接管理:

    處理 HTTP 連接池、重試機制、節(jié)點發(fā)現(xiàn)等底層細(xì)節(jié),開發(fā)者無需關(guān)注。

    這意味著:
      • 連接池管理:自動管理 HTTP 連接池,提高性能。
      • 重試機制:在請求失敗時,客戶端可以自動重試
      • 節(jié)點發(fā)現(xiàn):支持自動發(fā)現(xiàn)集群中的節(jié)點,實現(xiàn)負(fù)載均衡。
    開發(fā)者無需手動處理這些復(fù)雜的細(xì)節(jié),只需關(guān)注業(yè)務(wù)邏輯。
    https://www./guide/en/elasticsearch/client/java-api-client/current/introduction.html

二、環(huán)境準(zhǔn)備

在開始之前,確保我們已經(jīng)在本地或服務(wù)器上成功安裝并運行了 Elasticsearch 8.X。同時,我們的開發(fā)環(huán)境需要具備以下條件:

Java 版本:JDK 1.8 或更高版本 依賴庫:Elasticsearch Java API Client 在 pom.xml 文件中添加以下依賴:

<project xmlns="http://maven./POM/4.0.0" xmlns:xsi="http://www./2001/XMLSchema-instance" xsi:schemaLocation="http://maven./POM/4.0.0 http://maven./xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.mingyi.cn</groupId>
  <artifactId>ESJavaClient</artifactId>
  <version>0.0.1-SNAPSHOT</version>
     
   <dependencies>

    <dependency>
      <groupId>co.elastic.clients</groupId>
      <artifactId>elasticsearch-java</artifactId>
      <version>8.11.0</version>
    </dependency>

    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.12.3</version>
    </dependency>

 <dependency>
   <groupId>ch.qos.logback</groupId>
   <artifactId>logback-classic</artifactId>
   <version>1.2.3</version>
 </dependency>
  </dependencies>
  
</project>

三、Elasticsearch 客戶端初始化

1. 基于 HTTPS 的客戶端初始化

Elasticsearch 8.X 默認(rèn)開啟了安全特性,需要通過 HTTPS 進(jìn)行通信。以下是初始化客戶端的主要步驟:

  • 設(shè)置認(rèn)證信息:使用用戶名和密碼進(jìn)行身份驗證。

  • 加載 CA 證書:用于建立安全的 SSL 連接。

  • 配置 SSL 上下文:創(chuàng)建 SSLContext,用于 HTTP 客戶端構(gòu)建。

// 設(shè)置用戶名和密碼
final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
credentialsProvider.setCredentials(AuthScope.ANY,
    new UsernamePasswordCredentials("elastic""your_password"));

// 加載 CA 證書
Path caCertificatePath = Paths.get("path/to/http_ca.crt");
CertificateFactory factory = CertificateFactory.getInstance("X.509");
Certificate trustedCa;
try (InputStream is = Files.newInputStream(caCertificatePath)) {
    trustedCa = factory.generateCertificate(is);
}

// 配置 SSL 上下文
KeyStore trustStore = KeyStore.getInstance("pkcs12");
trustStore.load(null, null);
trustStore.setCertificateEntry("ca", trustedCa);
SSLContextBuilder sslContextBuilder = SSLContexts.custom()
    .loadTrustMaterial(trustStore, null);
final SSLContext sslContext = sslContextBuilder.build();

// 構(gòu)建 RestClient
RestClientBuilder builder = RestClient.builder(
    new HttpHost("localhost", 9200, "https"))
    .setHttpClientConfigCallback(httpClientBuilder -> httpClientBuilder
        .setSSLContext(sslContext)
        .setDefaultCredentialsProvider(credentialsProvider)
        .setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE));

RestClient restClient = builder.build();

// 創(chuàng)建 Elasticsearch 客戶端
ElasticsearchTransport transport = new RestClientTransport(
    restClient, new JacksonJsonpMapper());
ElasticsearchClient client = new ElasticsearchClient(transport);

2. 使用 API Key 的客戶端初始化(可選)

如果希望使用 API Key 進(jìn)行認(rèn)證,可以按照以下方式配置:

String apiKeyId = "your_api_key_id";
String apiKeySecret = "your_api_key_secret";
String apiKeyAuth = Base64.getEncoder().encodeToString(
    (apiKeyId + ":" + apiKeySecret).getBytes(StandardCharsets.UTF_8));
Header[] defaultHeaders = {
    new BasicHeader("Authorization""ApiKey " + apiKeyAuth)
};
builder.setDefaultHeaders(defaultHeaders);

四、基本操作示例

1. 創(chuàng)建索引

public void createIndex(String indexName) throws IOException {
    client.indices().create(c -> c.index(indexName));
}

2. 索引文檔

public void indexDocument(String indexName, String id, Map<String, Object> document) throws IOException {
    client.index(i -> i.index(indexName).id(id).document(document));
}

3. 搜索文檔

public SearchResponse<Object> search(String indexName, List<Query> queries, List<SortOptions> sortOptions, int page, int pageSize) throws IOException {
    SearchRequest.Builder searchRequestBuilder = new SearchRequest.Builder()
        .index(indexName)
        .from(page * pageSize)
        .size(pageSize)
        .query(q -> q.bool(b -> b.must(queries)));

    if (sortOptions != null && !sortOptions.isEmpty()) {
        searchRequestBuilder.sort(sortOptions);
    }

    return client.search(searchRequestBuilder.build(), Object.class);
}

4. 聚合查詢

public SearchResponse<Object> aggregateSearch(String indexName, List<Query> queries, Map<String, Aggregation> aggregations) throws IOException {
    return client.search(s -> s
        .index(indexName)
        .query(q -> q.bool(b -> b.must(queries)))
        .aggregations(aggregations), Object.class);
}

5. 腳本排序示例

public SearchResponse<Map> searchWithScriptSort(String indexName, String fieldName, String queryText, String scriptSource, double factor) throws IOException {
    Query query = MatchQuery.of(m -> m.field(fieldName).query(queryText))._toQuery();

    Script script = Script.of(s -> s.inline(i -> i
        .source(scriptSource)
        .params("factor", JsonData.of(factor))));

    SortOptions sortOptions = SortOptions.of(so -> so.script(ss -> ss
        .script(script)
        .type(ScriptSortType.Number)
        .order(SortOrder.Asc)));

    SearchRequest searchRequest = new SearchRequest.Builder()
        .index(indexName)
        .query(query)
        .sort(sortOptions)
        .build();

    return client.search(searchRequest, Map.class);
}

五、完整代碼示例

以下是完整的代碼示例,大家可以根據(jù)需要進(jìn)行替換和修改,以適應(yīng)咱們自己的工程需求。

public class ElasticsearchService {
    private static final Logger logger = LoggerFactory.getLogger(ElasticsearchService.class);
    private ElasticsearchClient client;

    // 構(gòu)造函數(shù),初始化客戶端
    public ElasticsearchService() throws CertificateException, IOException, KeyStoreException, NoSuchAlgorithmException, KeyManagementException {
        // 初始化代碼(參考前文)
    }

    // 創(chuàng)建索引
    public void createIndex(String indexName) throws IOException {
        client.indices().create(c -> c.index(indexName));
    }

    // 索引文檔
    public void indexDocument(String indexName, String id, Map<String, Object> document) throws IOException {
        client.index(i -> i.index(indexName).id(id).document(document));
    }

    // 搜索文檔
    public SearchResponse<Object> search(...) throws IOException {
        // 實現(xiàn)代碼(參考前文)
    }

    // 聚合查詢
    public SearchResponse<Object> aggregateSearch(...) throws IOException {
        // 實現(xiàn)代碼(參考前文)
    }

    // 腳本排序示例
    public SearchResponse<Map> searchWithScriptSort(...) throws IOException {
        // 實現(xiàn)代碼(參考前文)
    }

    // 主方法示例
    public static void main(String[] args) {
        try {
            ElasticsearchService service = new ElasticsearchService();
            String indexName = "my-index";

            // 創(chuàng)建索引
            service.createIndex(indexName);

            // 索引文檔
            Map<String, Object> document = new HashMap<>();
            document.put("title""Elasticsearch Basics");
            document.put("author""John Doe");
            document.put("content""This is a tutorial for Elasticsearch.");
            service.indexDocument(indexName, "1", document);
            logger.info("Document indexed.");

            // 刷新索引
            service.client.indices().refresh(r -> r.index(indexName));

            // 搜索示例
            Query query = QueryBuilders.match(m -> m.field("title").query("Elasticsearch"));
            List<Query> queries = Arrays.asList(query);
            SearchResponse<Object> response = service.search(indexName, queries, null, 0, 10);
            response.hits().hits().forEach(hit -> logger.info(hit.source().toString()));

            // 聚合查詢示例
            Aggregation aggregation = AggregationBuilders.terms(t -> t.field("author.keyword"));
            Map<String, Aggregation> aggMap = new HashMap<>();
            aggMap.put("author_count", aggregation);
            SearchResponse<Object> aggResponse = service.aggregateSearch(indexName, queries, aggMap);
            aggResponse.aggregations().forEach((key, agg) -> logger.info(key + ": " + agg));

            // 腳本排序示例
            String scriptSource = "doc['content.keyword'].value.length() * params.factor";
            double factor = 1.1;
            SearchResponse<Map> scriptSortResponse = service.searchWithScriptSort(indexName, "content""Elasticsearch", scriptSource, factor);
            scriptSortResponse.hits().hits().forEach(hit -> logger.info(hit.source().toString()));

        } catch (Exception e) {
            logger.error("Error occurred:", e);
        }
    }
}

六、注意事項

6.1 認(rèn)證方式

Elasticsearch 8.X 默認(rèn)開啟了安全認(rèn)證,我們需要根據(jù)實際情況選擇使用用戶名密碼認(rèn)證或 API Key 認(rèn)證。

6.2 SSL 證書

確保正確加載了 Elasticsearch 提供的 CA 證書,以建立安全的 SSL 連接。

6.3 依賴版本

請確保使用的 Elasticsearch Java API Client 版本與 Elasticsearch 服務(wù)器版本匹配。

七、總結(jié)

本文詳細(xì)介紹了如何使用 Elasticsearch 8.X 的最新 Java API 進(jìn)行客戶端初始化、索引操作、搜索和聚合查詢。

通過完整的代碼示例,我們可以直接將其應(yīng)用于工程開發(fā)中。希望本文能對大家在使用 Elasticsearch 進(jìn)行開發(fā)時提供幫助。

執(zhí)行成果截圖

新寫入索引數(shù)據(jù)

完整可用工程下載地址:https://t./yLZmm

七、參考資料

短時間快習(xí)得多干貨!

和全球2000+ Elastic 愛好者一起精進(jìn)!

elastic6.cn——ElasticStack進(jìn)階助手

搶先一步學(xué)習(xí)進(jìn)階干貨!

    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多