Este tópico fornece códigos de exemplo e observações importantes para conexão com um cluster Alibaba Cloud Elasticsearch por meio de clientes PHP, Python, Java e Go.
Pré-requisitos
Crie um cluster Alibaba Cloud Elasticsearch. Para mais informações, consulte Criar um cluster Alibaba Cloud Elasticsearch.
-
Instale o cliente Elasticsearch correspondente à linguagem de programação desejada.
Use uma versão do cliente compatível com a versão do Elasticsearch para evitar problemas de compatibilidade. Para obter mais detalhes sobre a compatibilidade entre versões do Elasticsearch e clientes, consulte Compatibilidade.
-
Cliente Elasticsearch Go: Elasticsearch Go Client.
NotaAntes de usar Go para conectar-se a um cluster Alibaba Cloud Elasticsearch, instale um ambiente de compilação Go. Para mais informações, consulte The Go Programming Language. Os exemplos neste tópico usam Go 1.19.1.
-
Cliente Elasticsearch Java: Elasticsearch Java API Client.
NotaOs tipos de cliente Java incluem Transport Client, Low Level REST Client, High Level REST Client e Java API Client. Para ver códigos de exemplo de cada tipo, consulte Java API. Este tópico usa o High Level REST Client V6.7 como exemplo.
O Java Transport Client comunica-se com um cluster Elasticsearch via TCP. Podem ocorrer problemas de compatibilidade ao usar esse cliente para comunicação com clusters Elasticsearch de versões diferentes. Por esse motivo, o Transport Client foi descontinuado nas versões mais recentes. Se você usar o Transport Client V5.5 ou V5.6 para conectar-se a um cluster Elasticsearch V5.5 ou V5.6, poderá ocorrer um erro NoNodeAvailableException. Use o Transport Client V5.3.3 ou o Java Low Level REST Client para conectar-se ao cluster Elasticsearch e garantir a compatibilidade de versões.
-
Cliente Elasticsearch PHP: Elasticsearch PHP Client.
NotaO pool de conexões padrão do cliente Elasticsearch PHP não é adequado para ambientes de nuvem. O Alibaba Cloud Elasticsearch oferece um serviço de nome de domínio com balanceamento de carga. Portanto, sua aplicação PHP deve usar SimpleConnectionPool como pool de conexões. Caso contrário, erros de conexão podem ocorrer quando o cluster Alibaba Cloud Elasticsearch for reiniciado. A aplicação também deve implementar um mecanismo de reconexão. Mesmo com o SimpleConnectionPool, erros de conexão como "No enabled connection" ainda podem acontecer durante a reinicialização do cluster.
Cliente Elasticsearch Python: Elasticsearch Python Client.
Para mais informações sobre outros clientes Elasticsearch, consulte Elasticsearch Clients.
-
Ative o recurso Auto Indexing no cluster Elasticsearch. Para mais informações, consulte Configurar parâmetros YML.
-
Configure uma lista de permissões para o cluster Alibaba Cloud Elasticsearch a fim de garantir a conectividade de rede.
Se o servidor que executa seu código e o cluster Alibaba Cloud Elasticsearch estiverem na mesma Virtual Private Cloud (VPC), conecte-se usando o endpoint interno do cluster. Antes da conexão, adicione o endereço IP privado do servidor à lista de permissões de endereços IP privados da VPC (padrão: 0.0.0.0/0).
-
Caso o servidor que executa seu código esteja na rede pública, conecte-se usando o endpoint público do cluster. Ative o endpoint público e adicione o endereço IP público do servidor à lista de permissões de endereços IP públicos do cluster Alibaba Cloud Elasticsearch. Para mais informações, consulte Configurar uma lista de permissões de endereços IP públicos ou privados para um cluster Elasticsearch.
ImportanteAo conectar-se a partir de uma rede Wi-Fi ou banda larga, adicione seu endereço IP público à lista de permissões.
Também é possível definir a lista de permissões como 0.0.0.0/0 para permitir que todos os endereços IPv4 acessem o cluster Elasticsearch. Essa configuração expõe o cluster à rede pública e aumenta os riscos de segurança. Use essa opção apenas se compreender e aceitar os riscos associados.
Se nenhuma lista de permissões for configurada ou se a configuração estiver incorreta, ocorrerá um erro de
connection timeout.Para acessar nós Kibana a partir de um cliente, também é necessário configurar uma lista de permissões para o Kibana. Para mais informações, consulte Conectar-se a um cluster usando o Kibana.
Códigos de exemplo
Os exemplos a seguir demonstram como conectar-se a um cluster Alibaba Cloud Elasticsearch usando clientes comuns.
// This example uses Go 1.19.1.
package main
import (
"log"
"github.com/elastic/go-elasticsearch/v7"
)
func main() {
cfg := elasticsearch.Config {
Addresses: []string{
"<YourEsHost>",
},
Username: "<UserName>",
Password: "<YourPassword>",
}
es, err := elasticsearch.NewClient(cfg)
if err != nil {
log.Fatalf("Error creating the client: %s", err)
}
res, err := es.Info()
if err != nil {
log.Fatalf("Error getting response: %s", err)
}
defer res.Body.Close()
log.Println(res)
}
// This example uses High Level REST Client V6.7.
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 RestClientTest67 {
private static final RequestOptions COMMON_OPTIONS;
static {
RequestOptions.Builder builder = RequestOptions.DEFAULT.toBuilder();
// The default cache limit is 100 MB. This example changes the value to 30 MB.
builder.setHttpAsyncResponseConsumerFactory(
new HttpAsyncResponseConsumerFactory
.HeapBufferedResponseConsumerFactory(30 * 1024 * 1024));
COMMON_OPTIONS = builder.build();
}
public static void main(String[] args) {
// Alibaba Cloud Elasticsearch clusters require basic authentication.
final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
// Use the username and password that you configured when you created the Alibaba Cloud Elasticsearch cluster. They are also the logon credentials for the Kibana console.
credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials("<UserName>", "<YourPassword>"));
// Use a builder to create a REST client and configure the HttpClientConfigCallback of the HTTP client.
// To obtain the cluster endpoint, click the ID of your Elasticsearch cluster and go to the Basic Information page.
RestClientBuilder builder = RestClient.builder(new HttpHost("<YourEsHost>", 9200, "http"))
.setHttpClientConfigCallback(new RestClientBuilder.HttpClientConfigCallback() {
@Override
public HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpClientBuilder) {
return httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
}
});
// A RestHighLevelClient instance is built using a REST low-level client builder.
RestHighLevelClient highClient = new RestHighLevelClient(builder);
try {
// Create a request.
Map<String, Object> jsonMap = new HashMap<>();
jsonMap.put("<YourEsField1>", "<YourEsFieldValue1>");
jsonMap.put("<YourEsField2>", "<YourEsFieldValue2>");
IndexRequest indexRequest = new IndexRequest("<YourEsIndex>", "<YourEsType>", "<YourEsId>").source(jsonMap);
// Synchronously execute the request and use custom request options (COMMON_OPTIONS).
IndexResponse indexResponse = highClient.index(indexRequest, COMMON_OPTIONS);
long version = indexResponse.getVersion();
System.out.println("Index document successfully! " + version);
highClient.close();
} catch (IOException ioException) {
// Handle exceptions.
}
}
}
<?php
require 'vendor/autoload.php';
use Elasticsearch\ClientBuilder;
$client = ClientBuilder::create()->setHosts([
[
'host' => '<YourEsHost>',
'port' => '9200',
'scheme' => 'http',
'user' => '<UserName>',
'pass' => '<YourPassword>'
]
])->setConnectionPool('\Elasticsearch\ConnectionPool\SimpleConnectionPool', [])
->setRetries(10)->build();
$indexParams = [
'index' => '<YourEsIndex>',
'type' => '<YourEsType>',
'id' => '<YourEsId>',
'body' => ['<YourEsField>' => '<YourEsFieldValue>'],
'client' => [
'timeout' => 10,
'connect_timeout' => 10
]
];
$indexResponse = $client->index($indexParams);
print_r($indexResponse);
$searchParams = [
'index' => '<YourEsIndex>',
'type' => '<YourEsType>',
'body' => [
'query' => [
'match' => [
'<YourEsField>' => '<YourEsFieldValue>'
]
]
],
'client' => [
'timeout' => 10,
'connect_timeout' => 10
]
];
$searchResponse = $client->search($searchParams);
print_r($searchResponse);
?>
from elasticsearch import Elasticsearch, RequestsHttpConnection
import certifi
es = Elasticsearch(
['<YourEsHost>'],
http_auth=('<UserName>', '<YourPassword>'),
port=9200,
use_ssl=False
)
res = es.index(index="<YourEsIndex>", doc_type="<YourEsType>", id=<YourEsId>, body={"<YourEsField1>": "<YourEsFieldValue1>", "<YourEsField2>": "<YourEsFieldValue2>"})
res = es.get(index="<YourEsIndex>", doc_type="<YourEsType>", id=<YourEsId>)
print(res['_source'])
Se o cluster Elasticsearch usar o protocolo HTTPS, defina o valor de use_ssl como True e adicione verify_certs=True.
es = Elasticsearch(
['<YourEsHost>'],
http_auth=('<UserName>', '<YourPassword>'),
port=9200,
use_ssl=True,
verify_certs=True
)
Ao usar os códigos de exemplo, substitua os seguintes espaços reservados pelos valores reais.
|
Parâmetro |
Descrição |
|
<YourEsHost> |
Endpoint interno ou público do cluster Alibaba Cloud Elasticsearch. O endpoint está disponível na página Basic Information do cluster ou aplicação. |
|
<UserName> |
O nome de usuário do cluster Alibaba Cloud Elasticsearch é |
|
<YourPassword> |
Senha do usuário do cluster Alibaba Cloud Elasticsearch. Caso tenha esquecido a senha, redefina-a. Para um cluster Alibaba Cloud Elasticsearch, essa opção encontra-se na página Security dos detalhes do cluster. Para mais informações, consulte Redefinir a senha de acesso de um cluster Elasticsearch. |
|
<YourEsIndex> |
Nome do índice. |
|
<YourEsType> |
Tipo de documento. Importante
Em versões anteriores à 7,0 do Elasticsearch, o tipo de documento podia ser personalizado. A partir do Elasticsearch 7,0, o tipo de documento é |
|
<YourEsId> |
ID do documento. |
|
<YourEsField> |
Nome do campo. |
|
<YourEsFieldValue> |
Valor do campo especificado. |