Java High Level REST Client 7.x memungkinkan Anda memanggil API Elasticsearch dari aplikasi Java. Panduan ini menjelaskan cara menyiapkan klien serta menjalankan operasi index dan delete terhadap kluster Alibaba Cloud Elasticsearch.
Prasyarat
Sebelum memulai, pastikan Anda telah memiliki:
-
Kluster Alibaba Cloud Elasticsearch yang menjalankan versi 7.x. Untuk instruksi penyiapan, lihat Create an Alibaba Cloud Elasticsearch cluster.
-
Auto Indexing diaktifkan pada kluster. Tanpa fitur ini, operasi index akan gagal. Lihat Configure the YML file.
-
Akses jaringan yang telah dikonfigurasi antara klien Anda dan kluster (lihat Network access di bawah).
-
JDK 1.8 atau versi lebih baru yang telah diinstal.
-
Proyek Java Maven dengan dependensi POM dependencies yang telah ditambahkan ke
pom.xml.
Java High Level REST Client kompatibel maju (forward compatible). Sebagai contoh, klien versi 7.10 dapat bekerja dengan kluster yang menjalankan versi 7.10 atau lebih baru. Untuk mengakses fitur klien terbaru, gunakan versi klien yang sesuai dengan versi kluster Anda.
Akses jaringan
Pilih metode akses berdasarkan lokasi aplikasi Java Anda dijalankan.
Akses jaringan publik (Internet)
Jika aplikasi Anda dijalankan di luar virtual private cloud (VPC) kluster:
-
Aktifkan Public Network Access pada kluster.
-
Tambahkan alamat IP publik server aplikasi Anda ke daftar putih alamat IP publik kluster. Lihat Configure a public or private IP address whitelist for an Elasticsearch cluster.
-
Hubungkan menggunakan public endpoint kluster pada Port 9200.
Jika klien Anda berada di jaringan rumah atau kantor, tambahkan alamat IP egress Internet ke daftar putih — bukan alamat IP pribadi klien. Untuk mengizinkan semua alamat IPv4, tambahkan 0.0.0.0/0, tetapi perlu diketahui bahwa hal ini membuka akses kluster ke Internet publik.
Akses VPC (internal)
Jika aplikasi Anda dijalankan dalam VPC yang sama dengan kluster:
-
Hubungkan menggunakan private endpoint kluster pada Port 9200.
-
Daftar putih alamat IP pribadi secara default diatur ke
0.0.0.0/0, sehingga tidak diperlukan konfigurasi daftar putih tambahan kecuali jika kebijakan keamanan Anda mengharuskannya.
Jika tidak ada daftar putih yang dikonfigurasi atau konfigurasinya salah, koneksi akan timeout dengan error Timeout connecting. Untuk mengakses Kibana dari klien, konfigurasikan daftar putih alamat IP terpisah untuk Kibana. Lihat Configure a public or private IP address whitelist for Kibana.
Dependensi POM (Project Object Model)
Tambahkan dependensi berikut ke pom.xml Anda. Ganti 7.x dengan versi spesifik yang sesuai dengan kluster Anda, misalnya 7.10.2.
Maven
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>7.x</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>
Apache Log4j memiliki kerentanan eksekusi kode remote (RCE) yang telah diketahui. Lihat Vulnerability notice | RCE vulnerability in Apache Log4j 2 untuk detail dan langkah mitigasi.
Autentikasi
Klien menggunakan otentikasi akses dasar. Masukkan username dan password yang Anda atur saat membuat kluster — kredensial ini sama dengan yang digunakan untuk masuk ke Konsol Kibana.
final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
credentialsProvider.setCredentials(
AuthScope.ANY,
new UsernamePasswordCredentials("<username>", "<password>")
);
| Placeholder | Deskripsi |
|---|---|
<username> |
Username yang diatur saat membuat kluster Elasticsearch |
<password> |
Password yang diatur saat membuat kluster Elasticsearch |
Index dan hapus dokumen
Contoh berikut membuat RestHighLevelClient, mengindeks dokumen menggunakan Index API, dan menghapusnya menggunakan Delete API.
Contoh ini juga membatasi buffer respons async menjadi 30 MiB (dari nilai default 100 MiB) — berguna di lingkungan dengan memori JVM terbatas.
Unduh kode contoh lengkap.
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.action.delete.DeleteRequest;
import org.elasticsearch.action.delete.DeleteResponse;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.client.*;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
public class RestClientTest74 {
private static final RequestOptions COMMON_OPTIONS;
static {
RequestOptions.Builder builder = RequestOptions.DEFAULT.toBuilder();
// Batasi buffer respons async menjadi 30 MiB (default adalah 100 MiB).
builder.setHttpAsyncResponseConsumerFactory(
new HttpAsyncResponseConsumerFactory
.HeapBufferedResponseConsumerFactory(30 * 1024 * 1024));
COMMON_OPTIONS = builder.build();
}
public static void main(String[] args) {
// Konfigurasikan otentikasi akses dasar.
final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
credentialsProvider.setCredentials(
AuthScope.ANY,
new UsernamePasswordCredentials("<username>", "<password>")
);
// Bangun client. Gunakan public endpoint untuk akses Internet,
// atau private endpoint untuk akses VPC.
RestClientBuilder builder = RestClient
.builder(new HttpHost("<cluster-endpoint>", 9200, "http"))
.setHttpClientConfigCallback(new RestClientBuilder.HttpClientConfigCallback() {
@Override
public HttpAsyncClientBuilder customizeHttpClient(
HttpAsyncClientBuilder httpClientBuilder) {
return httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
}
});
RestHighLevelClient client = new RestHighLevelClient(builder);
try {
// --- Indeks dokumen ---
Map<String, Object> document = new HashMap<>();
document.put("<field_01>", "<value_01>");
document.put("<field_02>", "<value_02>");
// Untuk kluster Elasticsearch 7.x, tipe harus _doc.
IndexRequest indexRequest = new IndexRequest("<index_name>", "_doc", "<doc_id>")
.source(document);
IndexResponse indexResponse = client.index(indexRequest, COMMON_OPTIONS);
System.out.println("Dokumen diindeks. Versi: " + indexResponse.getVersion());
// --- Hapus dokumen ---
DeleteRequest deleteRequest = new DeleteRequest("<index_name>", "_doc", "<doc_id>");
DeleteResponse deleteResponse = client.delete(deleteRequest, COMMON_OPTIONS);
System.out.println("Dokumen dihapus: " + deleteResponse.toString());
} catch (IOException e) {
// Tangani error koneksi atau I/O.
} finally {
try {
client.close();
} catch (IOException e) {
// Tangani error saat menutup.
}
}
}
}
Ganti placeholder dengan nilai aktual Anda:
| Placeholder | Deskripsi | Contoh |
|---|---|---|
<username> |
Username kluster | elastic |
<password> |
Password kluster | — |
<cluster-endpoint> |
Endpoint publik atau pribadi, dari halaman Basic Information kluster | es-xxx.elasticsearch.aliyuncs.com |
<index_name> |
Nama indeks yang akan dibuat | my-index |
<doc_id> |
ID dokumen | 1 |
<field_01>, <field_02> |
Nama field dalam dokumen | title, content |
<value_01>, <value_02> |
Nilai field yang sesuai | Hello, World |
Konfigurasi konkurensi tinggi
Dalam skenario konkurensi tinggi, tingkatkan jumlah maksimum koneksi klien untuk menghindari antrian permintaan:
httpClientBuilder.setMaxConnTotal(500);
httpClientBuilder.setMaxConnPerRoute(300);
Inisialisasi klien lengkap dengan pengaturan kolam koneksi:
String host = "<cluster-endpoint>";
int port = 9200;
String username = "<username>";
String password = "<password>";
final int maxConnTotal = 500;
final int maxConnPerRoute = 300;
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(new HttpHost(host, port, "http"))
.setHttpClientConfigCallback(new RestClientBuilder.HttpClientConfigCallback() {
public HttpAsyncClientBuilder customizeHttpClient(
HttpAsyncClientBuilder httpClientBuilder) {
httpClientBuilder.setMaxConnTotal(maxConnTotal);
httpClientBuilder.setMaxConnPerRoute(maxConnPerRoute);
return httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
}
})
);
Langkah selanjutnya
-
Dokumentasi resmi Java High Level REST Client — referensi API lengkap untuk semua operasi yang didukung.