Ответ
Elasticsearch — это распределенная система для полнотекстового поиска и аналитики. Она часто используется для лог-менеджмента, поиска по сайту и анализа данных в реальном времени.
Преимущества:
- Высокая производительность: Оптимизирован для полнотекстового поиска, обеспечивает быстрый отклик даже на больших объемах данных.
- Горизонтальная масштабируемость: Легко масштабируется путем добавления новых узлов в кластер (шардирование и репликация).
- Гибкость схемы: Не требует строгой схемы данных (schema-less), что упрощает индексацию разнородных документов.
- Мощный API для запросов: Поддерживает сложные запросы, фильтрацию, агрегации и гео-поиск.
- Экосистема ELK/Elastic Stack: Глубокая интеграция с Kibana (визуализация) и Logstash/Beats (сбор и обработка данных).
Недостатки:
- Сложность в администрировании: Требует знаний для правильной настройки, оптимизации и поддержки кластера.
- Высокое потребление ресурсов: Особенно требователен к оперативной памяти (RAM).
- Не является ACID-совместимой СУБД: Elasticsearch обеспечивает согласованность в конечном счёте (eventual consistency). Он не подходит для систем, где требуются транзакции (например, банковские операции).
- Задержка индексации (Near Real-Time): Данные становятся доступны для поиска с небольшой задержкой (обычно около 1 секунды), что может быть критично для некоторых приложений.
- Крутая кривая обучения: Освоение языка запросов (Query DSL) для сложных сценариев требует времени.
Пример использования с официальным Go клиентом:
package main
import (
"context"
"fmt"
"github.com/elastic/go-elasticsearch/v8"
"strings"
)
func main() {
// Инициализация клиента
es, err := elasticsearch.NewDefaultClient()
if err != nil {
panic(err)
}
// Формирование тела запроса в формате JSON
query := `{
"query": {
"match": {
"title": "golang backend"
}
}
}`
// Выполнение запроса к индексу 'articles'
res, err := es.Search(
es.Search.WithContext(context.Background()),
es.Search.WithIndex("articles"),
es.Search.WithBody(strings.NewReader(query)),
es.Search.WithTrackTotalHits(true),
es.Search.WithPretty(),
)
if err != nil {
panic(err)
}
defer res.Body.Close()
fmt.Println(res)
}