Java Low Level REST Client mengirim permintaan HTTP mentah tanpa mengenkripsi atau mendekripsi isi permintaan atau respons, sehingga memberikan kendali penuh atas penanganan permintaan. Gunakan klien ini saat Anda perlu terhubung ke LindormSearch (kompatibel dengan Elasticsearch 7.10 dan versi sebelumnya) dan ingin mengelola serialisasi secara mandiri.
Prasyarat
Sebelum memulai, pastikan Anda telah:
Menginstal JDK 1.8 atau versi yang lebih baru.
Mengaktifkan LindormSearch untuk instans Lindorm Anda. Lihat Panduan aktivasi.
Menambahkan alamat IP klien Anda ke daftar putih instans Lindorm. Lihat Konfigurasi daftar putih.
Instal klien
Tambahkan dependensi berikut ke bagian dependencies pada file pom.xml atau file build Anda.
Maven:
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-client</artifactId>
<version>7.10.0</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.8.2</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.7</version>
</dependency>Gradle:
dependencies {
implementation 'org.elasticsearch.client:elasticsearch-rest-client:7.10.0'
implementation 'org.apache.logging.log4j:log4j-core:2.8.2'
implementation 'org.apache.logging.log4j:log4j-api:2.7'
}Konfigurasi koneksi
Buat RestClient dengan titik akhir LindormSearch dan kredensial:
String search_url = "ld-t4n5668xk31ui****-proxy-search-public.lindorm.rds.aliyuncs.com";
int search_port = 30070;
// Hanya untuk tujuan demo. Jangan hardcode kredensial di kode produksi.
String username = "user";
String password = "test";
final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(username, password));
RestClientBuilder restClientBuilder = RestClient.builder(new HttpHost(search_url, search_port));
restClientBuilder.setHttpClientConfigCallback(new RestClientBuilder.HttpClientConfigCallback() {
@Override
public HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpClientBuilder) {
return httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
}
});Parameter:
| Parameter | Deskripsi |
|---|---|
search_url | Titik akhir LindormSearch untuk Elasticsearch. Untuk mendapatkan titik akhir tersebut, lihat Lihat titik akhir. Gunakan titik akhir Virtual Private Cloud (VPC) untuk aplikasi yang berjalan pada instans ECS, atau titik akhir Internet untuk aplikasi lokal yang terhubung melalui jaringan publik. |
search_port | Port untuk titik akhir LindormSearch. Nilai tetap: 30070. |
username | Username untuk mesin pencari. Untuk mendapatkan kredensial default, buka Konsol Lindorm, klik Database Connections di panel navigasi kiri, lalu klik tab Search Engine. |
password | Password untuk mesin pencari. Ditemukan di lokasi yang sama dengan username. |
Gunakan koneksi VPC untuk aplikasi yang dideploy pada instans ECS — koneksi ini memberikan latensi lebih rendah dan keamanan lebih baik dibandingkan koneksi jaringan publik. Untuk terhubung melalui jaringan publik, aktifkan terlebih dahulu titik akhir publik: di Konsol Lindorm, klik Database Connections di panel navigasi kiri, klik tab Search Engine, lalu klik Enable Public Endpoint di pojok kanan atas.
Buat indeks
try (RestClient restClient = restClientBuilder.build()) {
String indexName = "lindorm_index";
Request indexRequest = new Request("PUT", "/" + indexName);
indexRequest.setJsonEntity("{" +
" \"settings\":{" +
" \"index.number_of_shards\": 1" +
" }," +
" \"mappings\":{" +
" \"properties\":{" +
" \"name\":{" +
" \"type\":\"text\"" +
" }" +
" }" +
" }" +
"}");
Response response = restClient.performRequest(indexRequest);
String responseBody = EntityUtils.toString(response.getEntity());
System.out.println("responseBody = " + responseBody);
}Respons sukses akan tampak seperti ini:
{"acknowledged":true,"shards_acknowledged":true,"index":"lindorm_index"}Tulis dokumen secara batch
Gunakan Bulk API untuk menulis beberapa dokumen dalam satu permintaan. Contoh berikut menulis 5.000 dokumen ke lindorm_index:
Random random = new Random();
Request bulkRequest = new Request("POST", "/_bulk");
StringBuilder bulkJsonBuilder = new StringBuilder();
for (int i = 0; i < 5000; i++) {
// Ganti nama dan nilai bidang dengan yang berasal dari aplikasi Anda.
bulkJsonBuilder.append("{\"index\":{\"_index\":\"").append(indexName).append("\",\"_id\":\"").append(i).append("\"}}").append("\n");
String value = random.nextInt() + "";
bulkJsonBuilder.append("{\"field1\":\"").append(value).append("\",\"field2\":\"").append(value).append("\"}").append("\n");
}
bulkRequest.setJsonEntity(bulkJsonBuilder.toString());
response = restClient.performRequest(bulkRequest);Setelah penulisan batch, kirim permintaan refresh agar dokumen tersebut dapat dilihat dalam pencarian:
response = restClient.performRequest(new Request("POST", "/" + indexName + "/_refresh"));
responseBody = EntityUtils.toString(response.getEntity());
System.out.println("responseBody = " + responseBody);Respons refresh yang sukses akan tampak seperti ini:
{"_shards":{"total":1,"successful":1,"failed":0}}Kueri dokumen
Kueri semua dokumen dalam indeks (secara default mengembalikan hingga 10 hasil):
response = restClient.performRequest(new Request("GET", "/" + indexName + "/_search"));
responseBody = EntityUtils.toString(response.getEntity());
System.out.println("responseBody = " + responseBody);Kueri dokumen berdasarkan ID:
response = restClient.performRequest(new Request("GET", "/" + indexName + "/_doc/0"));
responseBody = EntityUtils.toString(response.getEntity());
System.out.println("responseBody = " + responseBody);Respons kueri berdasarkan ID yang sukses akan tampak seperti ini:
{"_index":"lindorm_index","_id":"0","_version":1,"_seq_no":0,"_primary_term":1,"found":true,"_source":{"field1":"2127821774","field2":"2127821774"}}Hapus indeks
response = restClient.performRequest(new Request("DELETE", "/" + indexName));
responseBody = EntityUtils.toString(response.getEntity());
System.out.println("responseBody = " + responseBody);Respons penghapusan yang sukses akan tampak seperti ini:
{"acknowledged":true}Contoh lengkap
Berikut adalah program contoh lengkap yang menggabungkan semua operasi di atas:
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.apache.http.util.EntityUtils;
import org.elasticsearch.client.Request;
import org.elasticsearch.client.Response;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestClientBuilder;
import java.util.Random;
public class RestLClientTest {
public static void main(String[] args) {
String search_url = "ld-t4n5668xk31ui****-proxy-search-public.lindorm.rds.aliyuncs.com";
int search_port = 30070;
// Hanya untuk tujuan demo. Jangan hardcode kredensial di kode produksi.
String username = "user";
String password = "test";
final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(username, password));
RestClientBuilder restClientBuilder = RestClient.builder(new HttpHost(search_url, search_port));
restClientBuilder.setHttpClientConfigCallback(new RestClientBuilder.HttpClientConfigCallback() {
@Override
public HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpClientBuilder) {
return httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
}
});
try (RestClient restClient = restClientBuilder.build()) {
String indexName = "lindorm_index";
// Buat indeks pencarian.
Request indexRequest = new Request("PUT", "/" + indexName);
indexRequest.setJsonEntity("{" +
" \"settings\":{" +
" \"index.number_of_shards\": 1" +
" }," +
" \"mappings\":{" +
" \"properties\":{" +
" \"name\":{" +
" \"type\":\"text\"" +
" }" +
" }" +
" }" +
"}");
Response response = restClient.performRequest(indexRequest);
String responseBody = EntityUtils.toString(response.getEntity());
System.out.println("responseBody = " + responseBody);
// Tulis 5.000 dokumen dalam satu batch.
Random random = new Random();
Request bulkRequest = new Request("POST", "/_bulk");
StringBuilder bulkJsonBuilder = new StringBuilder();
for (int i = 0; i < 5000; i++) {
// Ganti nama dan nilai bidang dengan yang berasal dari aplikasi Anda.
bulkJsonBuilder.append("{\"index\":{\"_index\":\"").append(indexName).append("\",\"_id\":\"").append(i).append("\"}}").append("\n");
String value = random.nextInt() + "";
bulkJsonBuilder.append("{\"field1\":\"").append(value).append("\",\"field2\":\"").append(value).append("\"}").append("\n");
}
bulkRequest.setJsonEntity(bulkJsonBuilder.toString());
response = restClient.performRequest(bulkRequest);
// Refresh indeks agar dokumen yang ditulis menjadi terlihat.
response = restClient.performRequest(new Request("POST", "/" + indexName + "/_refresh"));
responseBody = EntityUtils.toString(response.getEntity());
System.out.println("responseBody = " + responseBody);
// Kueri semua dokumen dalam indeks (secara default mengembalikan hingga 10).
response = restClient.performRequest(new Request("GET", "/" + indexName + "/_search"));
responseBody = EntityUtils.toString(response.getEntity());
System.out.println("responseBody = " + responseBody);
// Kueri dokumen dengan ID 0.
response = restClient.performRequest(new Request("GET", "/" + indexName + "/_doc/0"));
responseBody = EntityUtils.toString(response.getEntity());
System.out.println("responseBody = " + responseBody);
// Hapus indeks.
response = restClient.performRequest(new Request("DELETE", "/" + indexName));
responseBody = EntityUtils.toString(response.getEntity());
System.out.println("responseBody = " + responseBody);
} catch (Exception e) {
System.out.println("msg: " + e.getMessage());
}
}
}