5 вопросов
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\"}}}")),
)Инвертированный индекс - от термина (слова) к списку документов, где он встречается, с позициями. Позволяет быстро находить документы по словам и строить полнотекстовый поиск. В ES при индексации текст анализируется (токенизация, стемминг), затем строится индекс. Из Go отправляют документы на индексацию и запросы query; детали индекса скрыты.
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)))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)))Агрегации - подсчеты и группировки: 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)))