Cliente Elasticsearch para Kotlin: integração, exemplos e recursos

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Cliente Elasticsearch para Kotlin: guia completo

\n\n

Elasticsearch é um poderoso sistema de busca distribuída, baseado no Lucene. Para trabalhar com ele a partir de aplicações Kotlin, utiliza-se o cliente oficial Elasticsearch Java Client, que é totalmente compatível com Kotlin devido à sua proximidade com a JVM. Neste artigo, vamos abordar como configurar o cliente, realizar operações básicas (indexação, busca, exclusão) e usar recursos avançados, como agregações e filtragem.

\n\n

Conexão e configuração

\n\n

Para começar, adicione a dependência no build.gradle.kts (ou build.gradle):

\n\n
// build.gradle.kts\ndependencies {\n    implementation("co.elastic.clients:elasticsearch-java:8.15.0")\n    implementation("com.fasterxml.jackson.core:jackson-databind:2.17.0")\n    implementation("com.fasterxml.jackson.module:jackson-module-kotlin:2.17.0")\n}
\n\n

Em seguida, crie o cliente:

\n\n
import co.elastic.clients.elasticsearch.ElasticsearchClient\nimport co.elastic.clients.json.jackson.JacksonJsonpMapper\nimport co.elastic.clients.transport.rest_client.RestClientTransport\nimport org.apache.http.HttpHost\nimport org.elasticsearch.client.RestClient\n\nfun createClient(): ElasticsearchClient {\n    val restClient = RestClient.builder(\n        HttpHost("localhost", 9200, "http")\n    ).build()\n\n    val transport = RestClientTransport(restClient, JacksonJsonpMapper())\n    return ElasticsearchClient(transport)\n}\n\nval client = createClient()
\n\n

Operações básicas

\n\n

Indexação de documento

\n\n

Crie uma data class para representar os dados:

\n\n
data class Product(\n    val id: String,\n    val name: String,\n    val price: Double,\n    val category: String\n)
\n\n

A indexação é feita assim:

\n\n
suspend fun indexProduct(product: Product) {\n    client.index { i ->\n        i.index("products")\n            .id(product.id)\n            .document(product)\n    }\n}\n\n// Exemplo de chamada\nval product = Product("1", "Notebook", 999.99, "Eletrônicos")\nrunBlocking { indexProduct(product) }
\n\n

Busca por campos

\n\n
suspend fun searchByName(name: String): List<Product> {\n    val response = client.search<Product>({ s ->\n        s.index("products")\n            .query { q ->\n                q.match { m ->\n                    m.field("name")\n                        .query(name)\n                }\n            }\n    }, Product::class.java)\n\n    return response.hits().hits().map { it.source()!! }\n}
\n\n

Exclusão de documento

\n\n
suspend fun deleteProduct(id: String) {\n    client.delete { d ->\n        d.index("products")\n            .id(id)\n    }\n}
\n\n

Filtragem e agregações

\n\n

O Elasticsearch suporta consultas complexas. Por exemplo, busca de produtos em uma faixa de preço com agregação por categorias:

\n\n
suspend fun searchWithAggregation(minPrice: Double, maxPrice: Double) {\n    val response = client.search<Product>({ s ->\n        s.index("products")\n            .query { q ->\n                q.range { r ->\n                    r.field("price")\n                        .gte(minPrice.toString())\n                        .lte(maxPrice.toString())\n                }\n            }\n            .aggregations("by_category") { a ->\n                a.terms { t ->\n                    t.field("category")\n                }\n            }\n    }, Product::class.java)\n\n    // Obtendo os resultados da agregação\n    val categories = response.aggregations()\n        ?.get("by_category")\n        ?.sterms()\n        ?.buckets()\n        ?.map { "${it.key()}: ${it.docCount()}" }\n        ?: emptyList()\n\n    println("Categorias: $categories")\n}
\n\n

Processamento em lote (Bulk API)

\n\n

Para indexação em massa, use bulk

Recommendations