Cliente Elasticsearch para Kotlin: guia completo
\n\nElasticsearch é 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\nConexão e configuração
\n\nPara começar, adicione a dependência no build.gradle.kts (ou build.gradle):
// 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\nEm seguida, crie o cliente:
\n\nimport 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\nOperações básicas
\n\nIndexação de documento
\n\nCrie uma data class para representar os dados:
\n\ndata class Product(\n val id: String,\n val name: String,\n val price: Double,\n val category: String\n)\n\nA indexação é feita assim:
\n\nsuspend 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\nBusca por campos
\n\nsuspend 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\nExclusão de documento
\n\nsuspend fun deleteProduct(id: String) {\n client.delete { d ->\n d.index("products")\n .id(id)\n }\n}\n\nFiltragem e agregações
\n\nO Elasticsearch suporta consultas complexas. Por exemplo, busca de produtos em uma faixa de preço com agregação por categorias:
\n\nsuspend 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\nProcessamento em lote (Bulk API)
\n\nPara indexação em massa, use bulk
Também na biblioteca
Bibliotecas WebSocket Java: Guia Completo para Implementação em Tempo Real
Cliente HTTP para C++: as melhores bibliotecas para trabalhar com rede
Cliente OAuth para Rust: biblioteca oauth2
Configuração de aplicações Kotlin: Biblioteca Hoplite