ES против обычной БД и ClickHouse

Ставим Elasticsearch рядом с реляционной БД и с ClickHouse, чтобы понимать, для каких задач он, а для каких — нет.

Elasticsearch — не замена базе данных: это поисково-аналитический движок; для строгих транзакций берут реляционную БД, для тяжёлой колоночной аналитики — ClickHouse.

ES против реляционной БД

КритерийРеляционная БДElasticsearch
Модельтаблицы, строки, схема, связиденормализованные JSON-документы
Транзакцииполноценные ACIDнет многодокументных транзакций
Сильная сторонацелостность, связи, точные выборкиполнотекстовый поиск, релевантность, агрегации
JOINоснова моделипочти нет; данные денормализуют
Свежесть данныхвидно сразу (read-after-write)задержка refresh (~1 с)

Вывод: источник истины — реляционная БД (заказы, платежи, пользователи с гарантиями). Elasticsearch — производный слой для поиска и аналитики, который наполняют из основной БД. Их часто используют вместе.

ES против ClickHouse

ClickHouse — колоночная СУБД для аналитики (OLAP) на огромных объёмах. Здесь сравнение тоньше, потому что у ES тоже сильная аналитика (агрегации).

КритерийClickHouseElasticsearch
Сильная сторонасканирующая аналитика по миллиардам строк, SQLполнотекстовый поиск + релевантность + агрегации
Хранениеколоночное, сильное сжатиеинвертированный индекс + doc values
ЗапросыSQL, тяжёлые GROUP BY, JOINQuery DSL, поиск по тексту
Где блистаетдашборды по терабайтам, агрегаты по «холодным» даннымпоиск, логи с текстом, гибкий ранжированный поиск

Грубо: нужен поиск по тексту с релевантностью — Elasticsearch. Нужна тяжёлая числовая аналитика по огромным таблицам без полнотекстового поиска — ClickHouse часто быстрее и дешевле по железу.

Как работает под капотом

Разница в том, что оптимизировано. Реляционная БД хранит строки и держит индексы-деревья по значениям для точных выборок и связей. ES хранит инвертированный индекс (слово → документы) и потому блестяще ищет текст, но не делает дешёвые JOIN. ClickHouse хранит данные по колонкам: чтобы посчитать сумму по столбцу, он читает только этот столбец (сильно сжатый) и сканирует его на огромной скорости, но искать произвольное слово в тексте, как ES, не умеет. Каждая структура хранения — это выбор, под какой класс запросов оптимизироваться.

Частые ошибки

  • Делать ES единственным хранилищем для важных данных. Без ACID и многодокументных транзакций он плохой источник истины для денег и заказов.
  • Эмулировать JOIN в ES. Связи в ES дороги (parent-child, nested); правильнее денормализовать данные при индексации.
  • Брать ES ради чисто числовой аналитики. Если полнотекстовый поиск не нужен, колоночная СУБД (ClickHouse) часто эффективнее.

Итоги

  • ES — не замена реляционной БД: нет ACID и дешёвых JOIN; он производный слой поиска и аналитики.
  • Источник истины держат в реляционной БД, а ES наполняют из неё.
  • Для полнотекстового поиска — ES; для тяжёлой числовой OLAP-аналитики без текста — часто ClickHouse.
Проверьте себя
1. Почему Elasticsearch обычно не используют как единственный источник истины для заказов и платежей?
AОн слишком быстрый
BУ него нет многодокументных ACID-транзакций и дешёвых JOIN, поэтому он плохой источник истины для критичных данных
CОн не умеет хранить числа
DОн не поддерживает JSON
2. В каком случае ClickHouse обычно предпочтительнее Elasticsearch?
AКогда нужен полнотекстовый поиск с релевантностью
BКогда нужна тяжёлая числовая аналитика (OLAP) по огромным таблицам без полнотекстового поиска
CКогда нужны опечатки и автодополнение
DКогда нужна подсветка совпадений