Cliente Elasticsearch para Kotlin: ferramenta poderosa para pesquisa e análise
Elasticsearch é um sistema de pesquisa e análise distribuído baseado no Apache Lucene, que permite realizar rapidamente pesquisa de texto completo, agregações e análise de grandes volumes de dados. Para trabalhar com Elasticsearch a partir de aplicações Kotlin, existem vários clientes, mas o mais moderno e recomendado é o Elasticsearch Java Client (a partir da versão 7.16) com suporte total para Kotlin. Neste artigo, abordaremos sua instalação, configuração e operações principais.
Instalação e conexão
Para começar, adicione a dependência ao seu build.gradle.kts:
dependencies { implementation("co.elastic.clients:elasticsearch-java:8.15.0") implementation("com.fasterxml.jackson.module:jackson-module-kotlin:2.17.0") implementation("jakarta.json:jakarta.json-api:2.1.3")}Para Maven (pom.xml):
<dependency> <groupId>co.elastic.clients</groupId> <artifactId>elasticsearch-java</artifactId> <version>8.15.0</version></dependency><dependency> <groupId>com.fasterxml.jackson.module</groupId> <artifactId>jackson-module-kotlin</artifactId> <version>2.17.0</version></dependency>Criação do cliente
A biblioteca usa o padrão Builder para configuração. Abaixo está um exemplo de criação de cliente com conexão a uma instância local do Elasticsearch:
import co.elastic.clients.elasticsearch.ElasticsearchClientimport co.elastic.clients.json.jackson.JacksonJsonpMapperimport co.elastic.clients.transport.ElasticsearchTransportimport co.elastic.clients.transport.rest_client.RestClientTransportimport org.apache.http.HttpHostimport org.elasticsearch.client.RestClient
fun createElasticsearchClient(): ElasticsearchClient { // Cria o cliente HTTP (sem autenticação) val restClient = RestClient.builder( HttpHost("localhost", 9200, "http") ).build()
// Cria o transporte com o mapeador JSON Jackson val transport: ElasticsearchTransport = RestClientTransport( restClient, JacksonJsonpMapper() )
// E retorna o cliente pronto return ElasticsearchClient(transport)}Para ambientes de produção, recomenda-se usar autenticação e HTTPS:
val credentialsProvider = BasicCredentialsProvider()credentialsProvider.setCredentials( AuthScope.ANY, UsernamePasswordCredentials("elastic", "your_password"))
val restClient = RestClient.builder( HttpHost("your-cluster.com", 9243, "https")).setHttpClientConfigCallback { httpClientBuilder -> httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider)}.build()Trabalhando com índices
Antes de realizar operações com documentos, é necessário criar um índice (se ele não existir). Exemplo de criação de índice com mapeamento:
suspend fun createIndex(client: ElasticsearchClient, indexName: String) { val response = client.indices().create { createBuilder -> createBuilder .index(indexName) .mappings { mappings -> mappings .properties("title") { prop -> prop.text { it } } .properties("content") { prop -> prop.text { it } } .properties("timestamp") { prop -> prop.date { it } } } } println("Índice criado: ${response.acknowledged}")}Operações CRUD com documentos
Criação/atualização de documento (Index API)
data class Article( val title: String, val content: String, val timestamp: String = java.time.Instant.now().toString())
suspend fun indexDocument(client: E