Ответ
Имею опыт интеграции 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)))
}