Elasticsearch клиент для Go (Golang): полное руководство по работе с ES

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Elasticsearch клиент для Go (Golang): мощный инструмент для работы с поиском

Elasticsearch — это распределённая поисковая и аналитическая система на базе Apache Lucene, которая позволяет выполнять полнотекстовый поиск, агрегации и аналитику в реальном времени. Для взаимодействия с Elasticsearch из языка Go (Golang) существует официальный клиент — go-elasticsearch. Это библиотека, разработанная и поддерживаемая командой Elastic, которая предоставляет полный набор инструментов для работы с REST API Elasticsearch.

Возможности и преимущества go-elasticsearch

Библиотека go-elasticsearch предлагает разработчикам на Go следующие возможности:

  • Полная поддержка Elasticsearch API — все версии API, включая индексацию, поиск, агрегации, управление кластером и настройками.
  • Типизированные вспомогательные функции — упрощают создание запросов и обработку ответов.
  • Поддержка bulk-операций — массовая вставка, обновление и удаление документов.
  • Автоматическое управление соединениями — пул соединений, повторные попытки при ошибках и балансировка нагрузки.
  • Совместимость с Go модулями — лёгкая установка и обновление через go get.
  • Поддержка контекстов (context) — отмена запросов и таймауты.
  • Расширяемость — возможность создания собственных транспортов и middleware.

Установка и настройка

Для установки библиотеки выполните команду:

go get github.com/elastic/go-elasticsearch/v8

После установки можно создать клиент с базовыми настройками:

package main

import (
    "log"
    "github.com/elastic/go-elasticsearch/v8"
)

func main() {
    cfg := elasticsearch.Config{
        Addresses: []string{
            "http://localhost:9200",
        },
    }
    es, err := elasticsearch.NewClient(cfg)
    if err != nil {
        log.Fatalf("Ошибка создания клиента: %s", err)
    }
    log.Println("Клиент Elasticsearch успешно создан")
}

Для подключения к кластеру с аутентификацией укажите логин и пароль:

cfg := elasticsearch.Config{
    Addresses: []string{"https://your-cluster-url:9200"},
    Username:  "elastic",
    Password:  "your_password",
}

Основные операции с данными

Создание индекса

res, err := es.Indices.Create("my_index")
if err != nil {
    log.Fatalf("Ошибка создания индекса: %s", err)
}
defer res.Body.Close()
log.Println(res.String())

Индексация документа

Для добавления документа используйте метод Index:

package main

import (
    "bytes"
    "encoding/json"
    "log"
    "github.com/elastic/go-elasticsearch/v8"
)

type Book struct {
    Title  string `json:"title"`
    Author string `json:"author"`
    Year   int    `json:"year"`
}

func main() {
    es, _ := elasticsearch.NewClient(elasticsearch.Config{
        Addresses: []string{"http://localhost:9200"},
    })

    book := Book{
        Title:  "Война и мир",
        Author: "Лев Толстой",
        Year:   1869,
    }

    data, _ := json.Marshal(book)
    res, err := es.Index("books", bytes.NewReader(data))
    if err != nil {
        log.Fatalf("Ошибка индексации: %s", err)
    }
    defer res.Body.Close()
    log.Println(res.String())
}

Поиск документов

Поиск выполняется через метод Search с телом запроса в формате JSON:

query := `{
    "query": {
        "match": {
            "author": "Толстой"
        }
    }
}`

res, err := es.Search(
    es.Search.WithIndex("books"),
    es.Search.WithBody(bytes.NewReader([]byte(query))),
    es.Search.WithPretty(),
)
if err != nil {
    log.Fatalf("Ошибка поиска: %s", err)
}
defer res.Body.Close()
log.Println(res.String())

Bulk-операции (массовая обработка)

Для вставки тысяч документов используйте bulk-запросы:

var buf bytes.Buffer
for i, book := range books {
    meta := []byte(`{"index": {"_index": "books", "_id": "` + strconv.Itoa(i) + `"}}` + "\n")
    data, _ := json.Marshal(book)
    buf.Grow(len(meta) + len(data) + 1)
    buf.Write(meta)
    buf.Write(data)
    buf.WriteByte('\n')
}

res, err := es.Bulk(bytes.NewReader(buf.Bytes()))
if err != nil {
    log.Fatalf("Ошибка bulk                    

Рекомендаций