Client Elasticsearch pour Kotlin : un outil puissant pour la recherche et l'analyse
Elasticsearch est un système de recherche et d'analyse distribué basé sur Apache Lucene, qui permet d'effectuer rapidement des recherches en texte intégral, des agrégations et l'analyse de grands volumes de données. Pour travailler avec Elasticsearch depuis des applications Kotlin, il existe plusieurs clients, mais le plus moderne et recommandé est le Elasticsearch Java Client (à partir de la version 7.16) avec une prise en charge complète de Kotlin. Dans cet article, nous aborderons son installation, sa configuration et les opérations de base.
Installation et connexion
Pour commencer, ajoutez la dépendance dans votre 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")}Pour 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>Création du client
La bibliothèque utilise le modèle Builder pour la configuration. Voici un exemple de création d'un client avec connexion à une instance locale d'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 { // Création du client HTTP (sans authentification) val restClient = RestClient.builder( HttpHost("localhost", 9200, "http") ).build()
// Création du transport avec le mapper JSON Jackson val transport: ElasticsearchTransport = RestClientTransport( restClient, JacksonJsonpMapper() )
// Retourne le client prêt à l'emploi return ElasticsearchClient(transport)}Pour un environnement de production, il est recommandé d'utiliser l'authentification et 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()Gestion des index
Avant d'effectuer des opérations sur les documents, vous devez créer un index (s'il n'existe pas). Exemple de création d'un index avec un mapping :
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("Index créé : ${response.acknowledged}")}Opérations CRUD sur les documents
Création/mise à jour d'un document (API Index)
data class Article( val title: String, val content: String, val timestamp: String = java.time.Instant.now().toString())
suspend fun indexDocument(client: E