Topik ini menjelaskan cara menggunakan Java Low Level REST Client 5.x untuk memanggil API Elasticsearch dari Java melalui HTTP.
Java Low Level REST Client 5.x hanya kompatibel dengan Alibaba Cloud Elasticsearch V5.5.3. Untuk Elasticsearch V6.3.2, lihat Java REST Client 6.3.2.
Prasyarat
Sebelum memulai, pastikan Anda telah memiliki:
-
JDK 1.8 atau versi yang lebih baru. Lihat Install a JDK.
-
Kluster Alibaba Cloud Elasticsearch V5.5.3. Lihat Create an Alibaba Cloud Elasticsearch cluster.
-
Fitur Auto Indexing diaktifkan pada kluster. Lihat Configure the YML file. Jika Auto Indexing tidak diaktifkan, kesalahan berikut akan muncul:

-
Akses jaringan yang dikonfigurasi antara server Java Anda dan kluster:
-
Akses Internet: Aktifkan fitur Public Network Access dan tambahkan alamat IP publik server Anda ke daftar putih alamat IP publik kluster. Lihat Configure a public or private IP address whitelist for an Elasticsearch cluster.
Penting-
Jika client Anda berada di jaringan rumah atau LAN perusahaan, tambahkan alamat IP egress Internet ke daftar putih, bukan alamat IP privat client tersebut.
-
Menambahkan
0.0.0.0/0ke daftar putih memungkinkan semua alamat IPv4 publik mengakses kluster. Evaluasi risiko keamanan sebelum menggunakan pengaturan ini. -
Entri daftar putih yang tidak ada atau salah menyebabkan error "Timeout connecting".
-
Untuk mengakses Kibana dari client, konfigurasikan daftar putih terpisah untuk Kibana. Lihat Configure a public or private IP address whitelist for Kibana.
-
-
Akses VPC: Gunakan titik akhir internal kluster. Secara default,
0.0.0.0/0sudah ada dalam daftar putih alamat IP privat.
-
-
Proyek Java Maven.
Tambahkan dependensi Maven
Tambahkan dependensi berikut ke file pom.xml Anda. Versi client harus sesuai dengan versi kluster Elasticsearch Anda.
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>rest</artifactId>
<version>5.5.3</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.7.1</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.7.1</version>
</dependency>
Kerentanan eksekusi kode remote (RCE) mungkin terdapat pada Apache Log4j 2. Lihat Vulnerability notice | RCE vulnerability in Apache Log4j 2.
Hubungkan ke kluster dan jalankan permintaan
Anda dapat mengunduh kode contoh lengkap.
Semua contoh terhubung ke kluster melalui Port 9200 dan menggunakan BasicCredentialsProvider untuk otentikasi.
Inisialisasi client
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.RestClient;
import org.elasticsearch.client.RestClientBuilder;
// Konfigurasikan kredensial
final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
credentialsProvider.setCredentials(AuthScope.ANY,
new UsernamePasswordCredentials("<username>", "<password>"));
// Bangun client. Ganti <host> dengan titik akhir publik atau internal
// dari halaman Informasi Dasar kluster Anda.
RestClient restClient = RestClient.builder(new HttpHost("<host>", 9200))
.setHttpClientConfigCallback(new RestClientBuilder.HttpClientConfigCallback() {
@Override
public HttpAsyncClientBuilder customizeHttpClient(
HttpAsyncClientBuilder httpClientBuilder) {
return httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
}
}).build();
Indeks dan ambil dokumen
Contoh berikut mengindeks sebuah dokumen lalu mengambilnya kembali:
import org.apache.http.HttpEntity;
import org.apache.http.entity.ContentType;
import org.apache.http.nio.entity.NStringEntity;
import org.apache.http.util.EntityUtils;
import org.elasticsearch.client.Response;
import java.io.IOException;
import java.util.Collections;
public class RestClientTest55 {
public static void main(String[] args) {
// (Inisialisasi restClient seperti yang ditunjukkan di atas)
try {
// Indeks dokumen dengan PUT /index_name/type_name/doc_id
HttpEntity entity = new NStringEntity(
"{\n\"field_01\" : \"value_01\"\n,\n\"field_02\" : \"value_02\"\n}",
ContentType.APPLICATION_JSON);
Response indexResponse = restClient.performRequest(
"PUT",
"/index_name/type_name/doc_id",
Collections.<String, String>emptyMap(),
entity);
// Ambil dokumen dengan GET /index_name/type_name/doc_id
Response response = restClient.performRequest(
"GET",
"/index_name/type_name/doc_id",
Collections.singletonMap("pretty", "true"));
// Cetak badan respons
System.out.println(EntityUtils.toString(response.getEntity()));
} catch (IOException e) {
e.printStackTrace();
}
}
}
Ganti placeholder berikut dengan nilai aktual Anda:
| Placeholder | Deskripsi |
|---|---|
<username> |
Username kluster Elasticsearch |
<password> |
Password kluster Elasticsearch |
<host> |
Titik akhir publik atau internal kluster. Temukan informasi ini di halaman Basic Information. Lihat View the basic information of a cluster. |
index_name |
Nama indeks |
type_name |
Nama tipe |
doc_id |
ID dokumen |
Pemecahan Masalah
| Gejala | Kemungkinan penyebab | Perbaikan |
|---|---|---|
Timeout connecting |
Daftar putih alamat IP tidak ada atau salah | Tambahkan alamat IP server Anda ke daftar putih kluster. Untuk akses Internet, gunakan alamat IP egress Internet, bukan alamat IP privat client. |
| Kesalahan pembuatan indeks |
Auto Indexing dinonaktifkan | Aktifkan fitur Auto Indexing. Lihat Configure the YML file. |
Langkah Berikutnya
-
Java REST Client 6.3.2 — gunakan client ini jika kluster Anda menjalankan Elasticsearch V6.3.2
-
View the basic information of a cluster — temukan titik akhir kluster dan detail lainnya
-
Configure a public or private IP address whitelist for an Elasticsearch cluster — kelola akses jaringan