Cliente Elasticsearch para Go (Golang): ferramenta poderosa para trabalhar com o motor de busca
Elasticsearch é um sistema de busca distribuído e de texto completo, construído sobre o Apache Lucene. Para interagir eficientemente com ele a partir de aplicações em Go (Golang), utiliza-se o cliente oficial go-elasticsearch. Esta biblioteca fornece uma API conveniente e performática para realizar todas as operações principais: desde a indexação de documentos até consultas analíticas complexas.
Neste artigo, exploraremos detalhadamente os recursos da biblioteca, sua instalação, configuração e apresentaremos exemplos práticos de código em Go.
Principais recursos do go-elasticsearch
- Suporte completo à REST API do Elasticsearch — trabalho com índices, documentos, busca, agregações e gerenciamento de cluster.
- Consultas type-safe — uso de structs Go para construir requisições JSON.
- Gerenciamento automático de conexões — pool de conexões, tentativas de repetição em caso de erros, balanceamento de carga.
- Suporte a operações bulk — indexação e atualização em massa de documentos.
- Integração com contextos Go — cancelamento de requisições e timeouts.
- Configuração fácil — clientes HTTP personalizados, logging, compressão.
Instalação
Para instalar a biblioteca, execute o comando no terminal:
go get github.com/elastic/go-elasticsearch/v8Certifique-se de que sua versão do Go seja pelo menos 1.18. Se você estiver usando uma versão mais antiga do Elasticsearch (por exemplo, 7.x), instale a versão correspondente do cliente:
go get github.com/elastic/go-elasticsearch/v7Conexão básica e configuração
Para começar, crie um cliente informando o endereço do servidor Elasticsearch:
package main
import ( "log" "github.com/elastic/go-elasticsearch/v8")
func main() { cfg := elasticsearch.Config{ Addresses: []string{ "http://localhost:9200", }, // Se for necessária autenticação: // Username: "elastic", // Password: "changeme", }
es, err := elasticsearch.NewClient(cfg) if err != nil { log.Fatalf("Erro ao criar cliente: %s", err) }
// Verificar conexão res, err := es.Info() if err != nil { log.Fatalf("Erro ao obter informações: %s", err) } defer res.Body.Close()
log.Println(res.String())}Indexação de documentos
Para adicionar um documento a um índice, use o método Index() ou Create(). Veja um exemplo com dados tipados:
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", // para atualização imediata }
res, err := req.Do(context.Background(), es) if err != nil { return err } defer res.Body.Close()
if res.IsError() { return fmt.Errorf("erro de indexação: %s", res.String()) }
return nil}Busca de documentos
Para realizar consultas de busca, use o método Search(). Exemplo de busca de texto completo:
func searchArticles(es *elasticsearch.Client, query string) ([]Article, error) { var buf bytes.Buffer searchQuery := map[string]interface{}{ "quer Também na biblioteca
Joi para JavaScript (Node.js): guia completo com exemplos
Cobra para Go: guia completo com exemplos
Rate Limiting em Swift: Limitação de Frequência de Requisições para iOS e macOS
Geolocalização e Mapas em C# (.NET): bibliotecas, exemplos e recomendações
Guia completo do Laravel Passport para PHP: OAuth2 na prática