Client Elasticsearch pour Go (Golang) : un outil puissant pour travailler avec le moteur de recherche
Elasticsearch est un système de recherche distribué et en texte intégral, construit sur Apache Lucene. Pour interagir efficacement avec lui depuis des applications en Go (Golang), on utilise le client officiel go-elasticsearch. Cette bibliothèque fournit une API pratique et performante pour effectuer toutes les opérations de base : de l'indexation de documents aux requêtes analytiques complexes.
Dans cet article, nous allons détailler les capacités de la bibliothèque, son installation, sa configuration et fournir des exemples pratiques de code en Go.
Fonctionnalités principales de go-elasticsearch
- Prise en charge complète de l'API REST Elasticsearch — travail avec les index, les documents, la recherche, les agrégations et la gestion du cluster.
- Requêtes typées — utilisation de structures Go pour construire des requêtes JSON.
- Gestion automatique des connexions — pool de connexions, tentatives en cas d'erreur, équilibrage de charge.
- Prise en charge des opérations bulk — indexation et mise à jour massives de documents.
- Intégration avec les contextes Go — annulation des requêtes et timeouts.
- Configuration facile — clients HTTP personnalisés, journalisation, compression.
Installation
Pour installer la bibliothèque, exécutez la commande dans le terminal :
go get github.com/elastic/go-elasticsearch/v8Assurez-vous que votre version de Go est au moins 1.18. Si vous utilisez une version plus ancienne d'Elasticsearch (par exemple, 7.x), installez la version correspondante du client :
go get github.com/elastic/go-elasticsearch/v7Connexion et configuration de base
Pour commencer, créez un client en spécifiant l'adresse du serveur Elasticsearch :
package main
import ( "log" "github.com/elastic/go-elasticsearch/v8")
func main() { cfg := elasticsearch.Config{ Addresses: []string{ "http://localhost:9200", }, // Si une authentification est requise : // Username: "elastic", // Password: "changeme", }
es, err := elasticsearch.NewClient(cfg) if err != nil { log.Fatalf("Erreur lors de la création du client : %s", err) }
// Vérification de la connexion res, err := es.Info() if err != nil { log.Fatalf("Erreur lors de la récupération des informations : %s", err) } defer res.Body.Close()
log.Println(res.String())}Indexation de documents
Pour ajouter un document à un index, utilisez la méthode Index() ou Create(). Voici un exemple avec des données typées :
type Article struct { ID int `json:"id"` Title string `json:"title"` Content string `json:"content"` Tags []string `json:"tags"` Date string `json:"date"`}
func indexArticle(es *elasticsearch.Client, article Article) error { body, err := json.Marshal(article) if err != nil { return err }
req := esapi.IndexRequest{ Index: "articles", DocumentID: strconv.Itoa(article.ID), Body: strings.NewReader(string(body)), Refresh: "true", // pour une mise à jour immédiate }
res, err := req.Do(context.Background(), es) if err != nil { return err } defer res.Body.Close()
if res.IsError() { return fmt.Errorf("erreur d'indexation : %s", res.String()) }
return nil}Recherche de documents
Pour effectuer des requêtes de recherche, utilisez la méthode Search(). Exemple de recherche en texte intégral :
func searchArticles(es *elasticsearch.Client, query string) ([]Article, error) { var buf bytes.Buffer searchQuery := map[string]interface{}{ "quer