Расскажите о вашем опыте работы с Elasticsearch.

Ответ

Имею опыт интеграции Go-сервисов с Elasticsearch для реализации полнотекстового поиска, агрегации логов и аналитики данных. В основном использовал официальный клиент elastic/go-elasticsearch.

Ключевые задачи и области экспертизы:

  • Индексация данных: реализовывал логику для индексации, обновления и удаления документов, в том числе с использованием Bulk API для массовых операций.
  • Построение запросов: составлял сложные поисковые запросы, используя bool queries, match, term, range, а также настраивал релевантность с помощью fuzzy поиска и function_score.
  • Агрегации: строил агрегации для сбора статистики и аналитики (например, terms, date_histogram).
  • Оптимизация: анализировал и оптимизировал медленные запросы, настраивал маппинги и анализаторы для корректной индексации и поиска.
  • Администрирование: знаком с базовыми концепциями управления кластером: шардирование, репликация, настройка index templates.

Пример кода для поиска в Go:

package main

import (
    "context"
    "encoding/json"
    "log"
    "strings"

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

func main() {
    // Инициализация клиента
    client, err := elasticsearch.NewClient(elasticsearch.Config{
        Addresses: []string{"http://localhost:9200"},
    })
    if err != nil {
        log.Fatalf("Error creating the client: %s", err)
    }

    // Построение запроса в формате JSON
    var query = `{
        "query": {
            "match": {
                "name": "gopher"
            }
        }
    }`

    // Выполнение поиска
    res, err := client.Search(
        client.Search.WithContext(context.Background()),
        client.Search.WithIndex("products"),
        client.Search.WithBody(strings.NewReader(query)),
        client.Search.WithTrackTotalHits(true),
        client.Search.WithPretty(),
    )
    if err != nil {
        log.Fatalf("Error getting response: %s", err)
    }
    defer res.Body.Close()

    // Декодирование ответа
    var r map[string]interface{}
    if err := json.NewDecoder(res.Body).Decode(&r); err != nil {
        log.Fatalf("Error parsing the response body: %s", err)
    }
    log.Printf("Found %d hits", int(r["hits"].(map[string]interface{})["total"].(map[string]interface{})["value"].(float64)))
}