O Java Low Level REST Client envia requisições HTTP brutas sem codificar ou decodificar o corpo da requisição ou da resposta, oferecendo controle direto sobre o tratamento das requisições. Use este cliente quando precisar se conectar ao LindormSearch (compatível com Elasticsearch 7.10 e versões anteriores) e quiser gerenciar a serialização manualmente.
Pré-requisitos
Antes de começar, verifique se os seguintes requisitos foram atendidos:
JDK 1.8 ou posterior instalado
LindormSearch ativado na instância do Lindorm. Consulte Activation guide
Endereço IP do cliente adicionado à lista de permissões da instância do Lindorm. Consulte Configure a whitelist
Instale o cliente
Adicione as dependências abaixo à seção dependencies do arquivo pom.xml ou do arquivo de build.
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'
}
Configure a conexão
Crie um RestClient com o endpoint e as credenciais do LindormSearch:
String search_url = "ld-t4n5668xk31ui****-proxy-search-public.lindorm.rds.aliyuncs.com";
int search_port = 30070;
// For demo purposes only. Do not hardcode credentials in production code.
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);
}
});
Parâmetros:
|
Parâmetro |
Descrição |
|
|
Endpoint do LindormSearch para Elasticsearch. Para obter o endpoint, consulte View endpoints. Use o endpoint de Virtual Private Cloud (VPC) para aplicações executadas em uma instância ECS ou o endpoint de Internet para aplicações locais conectadas pela rede pública. |
|
|
Porta do endpoint do LindormSearch. Valor fixo: |
|
|
Nome de usuário do mecanismo de busca. Para obter as credenciais padrão, acesse o console do Lindorm, clique em Database Connections no painel de navegação à esquerda e selecione a aba Search Engine. |
|
|
Senha do mecanismo de busca. Disponível no mesmo local do |
Use uma conexão VPC para aplicações implantadas em uma instância ECS, pois ela oferece menor latência e maior segurança que a conexão de rede pública. Para se conectar pela rede pública, ative primeiro o endpoint público: no console do Lindorm, clique em Database Connections no painel de navegação à esquerda, selecione a aba Search Engine e clique em Enable Public Endpoint no canto superior direito.
Crie um índice
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);
}
Uma resposta bem-sucedida tem o seguinte formato:
{"acknowledged":true,"shards_acknowledged":true,"index":"lindorm_index"}
Grave documentos em massa
Use a Bulk API para gravar vários documentos em uma única requisição. O exemplo a seguir grava 5.000 documentos no índice lindorm_index:
Random random = new Random();
Request bulkRequest = new Request("POST", "/_bulk");
StringBuilder bulkJsonBuilder = new StringBuilder();
for (int i = 0; i < 5000; i++) {
// Replace field names and values with those from your application.
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);
Após a gravação em massa, envie uma requisição de atualização para tornar os documentos visíveis na busca:
response = restClient.performRequest(new Request("POST", "/" + indexName + "/_refresh"));
responseBody = EntityUtils.toString(response.getEntity());
System.out.println("responseBody = " + responseBody);
Uma resposta de atualização bem-sucedida apresenta este formato:
{"_shards":{"total":1,"successful":1,"failed":0}}
Consulte documentos
Consulte todos os documentos do índice (retorna até 10 resultados por padrão):
response = restClient.performRequest(new Request("GET", "/" + indexName + "/_search"));
responseBody = EntityUtils.toString(response.getEntity());
System.out.println("responseBody = " + responseBody);
Consulte um documento por ID:
response = restClient.performRequest(new Request("GET", "/" + indexName + "/_doc/0"));
responseBody = EntityUtils.toString(response.getEntity());
System.out.println("responseBody = " + responseBody);
A resposta de uma consulta por ID bem-sucedida segue este modelo:
{"_index":"lindorm_index","_id":"0","_version":1,"_seq_no":0,"_primary_term":1,"found":true,"_source":{"field1":"2127821774","field2":"2127821774"}}
Exclua um índice
response = restClient.performRequest(new Request("DELETE", "/" + indexName));
responseBody = EntityUtils.toString(response.getEntity());
System.out.println("responseBody = " + responseBody);
Uma resposta de exclusão bem-sucedida retorna o seguinte:
{"acknowledged":true}
Exemplo completo
O programa de exemplo abaixo combina todas as operações descritas anteriormente:
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;
// For demo purposes only. Do not hardcode credentials in production code.
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";
// Create a search 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);
// Write 5,000 documents in a batch.
Random random = new Random();
Request bulkRequest = new Request("POST", "/_bulk");
StringBuilder bulkJsonBuilder = new StringBuilder();
for (int i = 0; i < 5000; i++) {
// Replace field names and values with those from your application.
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 the index to make the written documents visible.
response = restClient.performRequest(new Request("POST", "/" + indexName + "/_refresh"));
responseBody = EntityUtils.toString(response.getEntity());
System.out.println("responseBody = " + responseBody);
// Query all documents in the index (returns up to 10 by default).
response = restClient.performRequest(new Request("GET", "/" + indexName + "/_search"));
responseBody = EntityUtils.toString(response.getEntity());
System.out.println("responseBody = " + responseBody);
// Query the document with ID 0.
response = restClient.performRequest(new Request("GET", "/" + indexName + "/_doc/0"));
responseBody = EntityUtils.toString(response.getEntity());
System.out.println("responseBody = " + responseBody);
// Delete the index.
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());
}
}
}