Client Elasticsearch pour Kotlin : guide complet
\n\nElasticsearch est un puissant moteur de recherche distribué basé sur Lucene. Pour l'utiliser depuis des applications Kotlin, on utilise le client officiel Elasticsearch Java Client, qui est entièrement compatible avec Kotlin grâce à sa proximité avec la JVM. Dans cet article, nous allons voir comment configurer le client, effectuer les opérations de base (indexation, recherche, suppression) et utiliser des fonctionnalités avancées telles que les agrégations et le filtrage.
\n\nConnexion et configuration
\n\nPour commencer, ajoutez la dépendance dans 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\nEnsuite, créez le client :
\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\nOpérations de base
\n\nIndexation d'un document
\n\nCréez une data class pour représenter les données :
\n\ndata class Product(\n val id: String,\n val name: String,\n val price: Double,\n val category: String\n)\n\nL'indexation s'effectue ainsi :
\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// Exemple d'appel\nval product = Product("1", "Ordinateur portable", 999.99, "Électronique")\nrunBlocking { indexProduct(product) }\n\nRecherche par champs
\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\nSuppression d'un document
\n\nsuspend fun deleteProduct(id: String) {\n client.delete { d ->\n d.index("products")\n .id(id)\n }\n}\n\nFiltrage et agrégations
\n\nElasticsearch prend en charge les requêtes complexes. Par exemple, rechercher des produits dans une fourchette de prix avec agrégation par catégories :
\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 // Récupération des résultats d'agrégation\n val categories = response.aggregations()\n ?.get("by_category")\n ?.sterms()\n ?.buckets()\n ?.map { "${it.key()}: ${it.docCount()}" }\n ?: emptyList()\n\n println("Catégories : $categories")\n}\n\nTraitement par lots (API Bulk)
\n\nPour l'indexation en masse, utilisez bulk
Aussi dans la bibliothèque
Autorisation et authentification en Go : packages et exemples pratiques
CreateML Swift : guide complet avec exemples pratiques
Traitement d'images : redimensionnement et recadrage en C++ avec OpenCV
Apprentissage automatique en C++ : aperçu des bibliothèques clés
sqlc pour Go : guide complet avec exemples concrets