全部產品
Search
文件中心

Elasticsearch:Java API Client(8.x)

更新時間:Nov 08, 2025

本文基於Java API Client 8.x版本,為您介紹Elasticsearch Java API的用法。

背景資訊

Elasticsearch在7.17版本之前使用的Java用戶端是Java REST Client,從7.17版本開始Elastic官方將Java REST Client標記為棄用(deprecated),並推薦使用新版Java用戶端Java API Client。

Java API Client簡介

Java API Client是一個用於與Elasticsearch伺服器進行通訊的Java用戶端庫,協助開發人員與Elasticsearch伺服器進行通訊,開發人員可以更加輕鬆地開發和維護代碼。

Java API Client主要包含三個部分:

  1. ElasticsearchClient類:Java API Client的核心類,提供與Elasticsearch伺服器進行通訊的方法。該類封裝了底層的Transport通訊,並提供了同步和非同步呼叫、流式和函數式調用等方法。

  2. JSON object mapper:處理資料序列化和還原序列化的庫。JSON object mapper與Jackson無縫整合,可以將Java對象映射到JSON格式。

  3. 通用能力:提供了串連池、重試、JSON序列化等通用能力,提高了代碼的可讀性和可維護性,便於開發人員進行開發。

準備工作

  • 安裝Java,要求JDK版本為1.8及以上。安裝方法請參見安裝JDK

  • 建立Elasticsearch執行個體,版本需大於或等於Java API Client的版本。本文建立一個8.x版本的執行個體,建立方法請參見建立Elasticsearch執行個體

    說明

    為了保證最大程度地使用新版用戶端的特性,推薦Java API Client版本與叢集版本一致。

  • 開啟Elasticsearch執行個體的自動建立索引功能,具體操作請參見配置YML參數。如果未開啟會提示如下報錯。報錯

  • 配置Elasticsearch執行個體的白名單,確保網路互連。

    • 如果運行Java代碼的伺服器在公網環境下,可通過Elasticsearch執行個體的公網地址進行連通。連通前,需要開啟Elasticsearch執行個體的公網地址,並修改公網地址訪問白名單,將伺服器的公網IP地址加入白名單中。具體操作步驟請參見配置執行個體公網或私網訪問白名單

      重要
      • 如果您的用戶端處在家用網路或公司區域網路中,您需要將區域網路的公網出口IP地址添加到白名單中,而非用戶端機器的內網地址。

      • 您也可以將白名單配置為0.0.0.0/0,允許所有IPv4地址訪問Elasticsearch執行個體。此配置會導致執行個體完全暴露在公網中,增加安全風險,配置前請確認您是否可以接受這個風險。

      • 如果未配置白名單或白名單配置錯誤,系統會提示連線逾時報錯(Timeout connecting)。

      • 如果您需要通過用戶端訪問Kibana節點,還需要配置Kibana的訪問白名單,詳細資料請參見配置Kibana公網或私網訪問白名單

    • 如果運行Java代碼的伺服器與Elasticsearch執行個體在同一Virtual Private Cloud(Virtual Private Cloud)中,可通過Elasticsearch執行個體的私網地址進行連通。連通前,需要確保VPC私網訪問白名單(預設為0.0.0.0/0)中已添加了伺服器的內網IP地址。

用戶端和ES服務串連配置

Elasticsearch初始化了三種用戶端:

  • 低級用戶端。

        // Create the low-level client
        RestClient restClient = RestClient.builder(
            new HttpHost("localhost", 9200,"http")).build();
  • 通訊Transport,並利用JacksonJsonpMapper做資料的解析。

        // Create the transport with a Jackson mapper
        ElasticsearchTransport transport = new RestClientTransport(
            restClient, new JacksonJsonpMapper());
  • 阻塞的Java用戶端。

        // And create the API client
        ElasticsearchClient elasticsearchClient = new ElasticsearchClient(transport);
        System.out.println("elasticsearchClient = " + elasticsearchClient);

pom依賴

使用時,您需要將pom依賴中的8.x版本號碼替換為具體的版本號碼。

重要

以阿里雲Elsaticsearch 8.17.0版本為例,需要您version設定為8.17.0,只有當version設定正確時才能拉取相關依賴。

<dependency>
    <groupId>co.elastic.clients</groupId>
    <artifactId>elasticsearch-java</artifactId>
    <version>8.x</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.12.3</version>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>2.20.0</version>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-api</artifactId>
    <version>2.20.0</version>
</dependency>
重要

Log4j可能存在遠程代碼執行漏洞,詳細資料請參見漏洞公告 | Apache Log4j2遠程代碼執行漏洞

樣本

以下範例程式碼中帶{}的參數需要替換為具體業務的參數。

import co.elastic.clients.elasticsearch.ElasticsearchClient;
import co.elastic.clients.elasticsearch.indices.*;
import co.elastic.clients.json.jackson.JacksonJsonpMapper;
import co.elastic.clients.transport.ElasticsearchTransport;
import co.elastic.clients.transport.rest_client.RestClientTransport;
import org.apache.http.HttpHost;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.impl.nio.client.HttpAsyncClientBuilder;
import org.elasticsearch.client.*;


import java.io.IOException;

public class RestClientTest {
    public static void main(String[] args) {

        // Elasticsearch叢集需要basic auth驗證。
        final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();

        //訪問使用者名稱和密碼為您建立Elasticsearch執行個體時設定的使用者名稱和密碼,也是Kibana控制台的登入使用者名稱和密碼。
        credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials("{訪問使用者名稱}", "{訪問密碼}"));
        // 通過builder建立rest client,配置http client的HttpClientConfigCallback。
        // 單擊所建立的Elasticsearch執行個體ID,在基本資料頁面擷取公網地址,即為ES叢集地址。
        RestClient restClient = RestClient.builder(new HttpHost("{ES叢集地址}", 9200, "http"))
                .setHttpClientConfigCallback(new RestClientBuilder.HttpClientConfigCallback() {
                    @Override
                    public HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpClientBuilder) {
                        return httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
                    }
                }).build();

        // 使用 Jackson 映射器建立傳輸
        ElasticsearchTransport transport = new RestClientTransport(restClient, new JacksonJsonpMapper());

        // 建立 API 用戶端
        ElasticsearchClient elasticsearchClient = new ElasticsearchClient(transport);
        //System.out.println("elasticsearchClient = " + elasticsearchClient);


        // 建立、刪除索引和查看所有索引資訊
        // 建立了一個名為 "foo" 的別名,並將其設定為寫入別名 (write index),這意味著所有寫入操作(例如索引、更新、刪除文檔)將自動路由到這個別名所對應的索引上。
        try {
            //建立索引
            CreateIndexResponse indexRequest = elasticsearchClient.indices().create(createIndexBuilder -> createIndexBuilder
                    .index("{index_name}")
                    .aliases("{foo}", aliasBuilder -> aliasBuilder
                            .isWriteIndex(true)
                    )
                );
            //檢查“indexRequest”請求的操作是否已被Elasticsearch叢集確認
            boolean acknowledged = indexRequest.acknowledged();
            System.out.println("Index document successfully! " + acknowledged);

            //刪除索引
            DeleteIndexResponse deleteResponse = elasticsearchClient.indices().delete(createIndexBuilder -> createIndexBuilder
                    .index("{index_name}")
            );
            System.out.println("Delete document successfully! \n" + deleteResponse.toString());

            //查看所有索引資訊(health status index uuid pri rep)
            IndicesResponse indicesResponse = elasticsearchClient.cat().indices();
            indicesResponse.valueBody().forEach(info -> System.out.println(info.health() + "\t"+  info.status() + "\t" + info.index() + "\t" + info.uuid() +"\t" + info.pri() + "\t" + info.rep()));


            transport.close();
            restClient.close();
        } catch (IOException ioException) {
            // 異常處理。
        }
    }
}

高並發情境需要增加用戶端串連數,具體配置如下:

httpClientBuilder.setMaxConnTotal(500); 
httpClientBuilder.setMaxConnPerRoute(300);

串連程式碼範例:

String host = "localhost";
int port = 9200;
String username = "elastic";
String password = "passwd";
final int max_conn_total = 500;
final int max_conn_per_route = 300;

    RestClient restClient = RestClient.builder(new HttpHost("localhost", 9200, "http"))
                .setHttpClientConfigCallback(new RestClientBuilder.HttpClientConfigCallback() {
                    @Override
                    public HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpClientBuilder) {
                        httpClientBuilder.setMaxConnTotal(max_conn_total);
                        httpClientBuilder.setMaxConnPerRoute(max_conn_per_route);
                        return httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
                    }
                }).build();

更多Java API Client的使用特性,請參見Java API Client官方文檔