Go: Elasticsearch

5 вопросов

1 Что такое Elasticsearch? Когда использовать из Go.

Elasticsearch - поисковая и аналитическая платформа на базе Lucene. Хранит документы в индексированном виде; полнотекстовый поиск, агрегации, геопоиск. Из Go подключаются через REST API (elasticsearch-go клиент) или через olivere/elastic. Используют для поиска по сайту, логов (ELK), метрик. Данные часто синхронизируют из основной БД в ES.

client, _ := elasticsearch.NewClient(elasticsearch.Config{Addresses: []string{"http://localhost:9200"}})
res, _ := client.Search(
    client.Search.WithIndex("products"),
    client.Search.WithBody(strings.NewReader("{\"query\":{\"match\":{\"name\":\"phone\"}}}")),
)
Открыть отдельно →
2 Инвертированный индекс в Elasticsearch.

Инвертированный индекс - от термина (слова) к списку документов, где он встречается, с позициями. Позволяет быстро находить документы по словам и строить полнотекстовый поиск. В ES при индексации текст анализируется (токенизация, стемминг), затем строится индекс. Из Go отправляют документы на индексацию и запросы query; детали индекса скрыты.

Открыть отдельно →
3 Mapping и анализаторы в Elasticsearch. Настройка из Go.

Mapping определяет типы полей и анализаторы. Анализатор - цепочка: tokenizer + фильтры (lowercase, stop, stemmer). Для полнотекста задают text с анализатором; для точного совпадения - keyword. В Go создают индекс с mapping через PutMapping API или при первом индексе (auto mapping). Для русского и других языков указывают анализатор (например, russian).

mapping := "{\"mappings\":{\"properties\":{\"title\":{\"type\":\"text\",\"analyzer\":\"russian\"},\"price\":{\"type\":\"integer\"}}}}"
client.Indices.Create("products", client.Indices.Create.WithBody(strings.NewReader(mapping)))
Открыть отдельно →
4 Поисковые запросы в Elasticsearch из Go.

Query DSL в JSON: match, term, range, bool (must, should, filter). В Go клиент принимает тело запроса как io.Reader или структуру. Результат - hits с _source и _score. Пагинация - from/size или search_after. Фильтры кешируются; для точных полей используют filter context.

query := map[string]interface{}{
    "query": map[string]interface{}{
        "bool": map[string]interface{}{
            "must": []map[string]interface{}{
                {"match": map[string]string{"title": "phone"}},
            },
        },
    },
}
body, _ := json.Marshal(query)
res, _ := client.Search(client.Search.WithIndex("products"), client.Search.WithBody(bytes.NewReader(body)))
Открыть отдельно →
5 Агрегации в Elasticsearch. Примеры из Go.

Агрегации - подсчеты и группировки: terms (по полю), sum, avg, min, max, date_histogram. В запросе передают агрегации в JSON; в ответе - buckets и значения. В Go формируют body с aggs, парсят ответ. Используют для фасетов, дашбордов, аналитики.

aggs := "{\"aggs\":{\"by_category\":{\"terms\":{\"field\":\"category\"}},\"avg_price\":{\"avg\":{\"field\":\"price\"}}}}"
body := fmt.Sprintf("{\"size\":0,\"aggs\":%s}", aggs)
res, _ := client.Search(..., client.Search.WithBody(strings.NewReader(body)))
Открыть отдельно →
🧠Квиз 🏆Лидеры 🎯Собесед. 📖Вопросы 📚База зн.