El cliente REST de bajo nivel en Java envía solicitudes HTTP sin procesar. No codifica ni decodifica el cuerpo de la solicitud o de la respuesta, por lo que usted tiene control directo sobre el manejo de las peticiones. Úselo cuando necesite conectarse a LindormSearch (compatible con Elasticsearch 7.10 y versiones anteriores) y prefiera gestionar la serialización por su cuenta.
Requisitos previos
Antes de empezar, asegúrese de contar con lo siguiente:
JDK 1.8 o una versión posterior instalada.
LindormSearch activado para su instancia de Lindorm. Consulte Activation guide.
La dirección IP de su cliente agregada a la lista blanca de la instancia de Lindorm. Consulte Configure a whitelist.
Instalar el cliente
Agregue las siguientes dependencias en la sección dependencies de su archivo pom.xml o de compilación.
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'
}
Configurar la conexión
Construya un objeto RestClient con el endpoint y las credenciales de 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 |
Descripción |
|
|
El endpoint de LindormSearch para Elasticsearch. Para obtenerlo, consulte View endpoints. Use el endpoint de Virtual Private Cloud (VPC) si sus aplicaciones se ejecutan en una instancia de ECS. Si son aplicaciones locales que se conectan por la red pública, use el endpoint de Internet. |
|
|
El puerto del endpoint de LindormSearch. Valor fijo: |
|
|
El nombre de usuario del motor de búsqueda. Para obtener las credenciales predeterminadas, vaya a la consola de Lindorm, haga clic en Database Connections en el panel de navegación izquierdo y luego seleccione la pestaña Search Engine. |
|
|
La contraseña del motor de búsqueda. Se encuentra en la misma ubicación que |
Use una conexión VPC para las aplicaciones desplegadas en una instancia de ECS, ya que ofrece menor latencia y mayor seguridad que una conexión por red pública. Para conectarse por la red pública, primero habilite el endpoint público: en la consola de Lindorm, haga clic en Database Connections en el panel de navegación izquierdo, seleccione la pestaña Search Engine y luego haga clic en Enable Public Endpoint en la esquina superior derecha.
Crear un í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);
}
Una respuesta exitosa se ve de la siguiente manera:
{"acknowledged":true,"shards_acknowledged":true,"index":"lindorm_index"}
Escribir documentos de forma masiva
Use la API Bulk para escribir varios documentos en una sola solicitud. En el siguiente ejemplo se escriben 5,000 documentos en 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);
Después de la escritura masiva, envíe una solicitud de actualización para que los documentos sean visibles en las búsquedas:
response = restClient.performRequest(new Request("POST", "/" + indexName + "/_refresh"));
responseBody = EntityUtils.toString(response.getEntity());
System.out.println("responseBody = " + responseBody);
Una respuesta de actualización exitosa se ve así:
{"_shards":{"total":1,"successful":1,"failed":0}}
Consultar documentos
Consultar todos los documentos del índice (devuelve hasta 10 resultados de forma predeterminada):
response = restClient.performRequest(new Request("GET", "/" + indexName + "/_search"));
responseBody = EntityUtils.toString(response.getEntity());
System.out.println("responseBody = " + responseBody);
Consultar un documento por su ID:
response = restClient.performRequest(new Request("GET", "/" + indexName + "/_doc/0"));
responseBody = EntityUtils.toString(response.getEntity());
System.out.println("responseBody = " + responseBody);
Una respuesta exitosa a la consulta por ID se ve de la siguiente manera:
{"_index":"lindorm_index","_id":"0","_version":1,"_seq_no":0,"_primary_term":1,"found":true,"_source":{"field1":"2127821774","field2":"2127821774"}}
Eliminar un índice
response = restClient.performRequest(new Request("DELETE", "/" + indexName));
responseBody = EntityUtils.toString(response.getEntity());
System.out.println("responseBody = " + responseBody);
Una respuesta de eliminación exitosa se ve así:
{"acknowledged":true}
Ejemplo completo
A continuación se muestra el programa de ejemplo completo que combina todas las operaciones anteriores:
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());
}
}
}