Loading

Go

This is the official Go client for Elasticsearch.

Full documentation is hosted at GitHub and PkgGoDev. This documentation provides only an overview of features.

  • One-to-one mapping with REST API.
  • Generalized, pluggable architecture.
  • Two API styles: low-level and fully typed.
  • Fluent DSL builders for constructing queries, aggregations, mappings, and sort options.
  • Built-in OpenTelemetry instrumentation for distributed tracing.
  • Interceptors for custom middleware (auth rotation, observability, etc.).
  • Automatic retries, request compression, and node discovery.
  • Helpers for convenience (bulk indexing, JSON encoding, and more).
  • Rich set of examples.

The client has a layered architecture where both the low-level and typed APIs share the same transport infrastructure:

graph LR
    App["Your Application"]
    TC["TypedClient / Client"]
    INT["Interceptors"]
    TP["Transport"]
    ES["Elasticsearch"]

    App --> TC
    TC --> INT
    INT --> TP
    TP --> ES

The transport layer handles retry logic, request compression, node selection (round-robin), and connection pooling. Interceptors are optional middleware that can modify requests and responses (e.g., for dynamic authentication or custom logging). See the Configuration reference for all available options.

package main

import (
    "context"
    "log"

    "github.com/elastic/go-elasticsearch/v9"
)

func main() {
    es, _ := elasticsearch.NewDefaultClient()
    defer es.Close(context.Background())

    res, err := es.Info()
    if err != nil {
        log.Fatal(err)
    }
    defer res.Body.Close()

    log.Println(res)
}
		
package main

import (
    "context"
    "log"

    "github.com/elastic/go-elasticsearch/v9"
)

func main() {
    es, _ := elasticsearch.NewTypedClient(elasticsearch.Config{
        Addresses: []string{"http://localhost:9200"},
    })
    defer es.Close(context.Background())
    log.Println(es.Info().Do(context.Background()))
}
		
Note

Please have a look at the collection of comprehensive examples in the repository at https://github.com/elastic/go-elasticsearch/tree/main/_examples.