|

Когда обычный поиск в интернете превращается в квест, поможет ElasticSearch

Когда Ctrl+F плачет в уголке

Знакома ли вам ситуация:

Представьте: у вас есть база знаний на 10,000 документов. Хотите найти статью про оптимизацию React приложений. Героический поиск по фразе “React оптимизация” выдаёт либо 847 результатов (где нужная статья затерялась на 23-й странице), либо гордое “Ничего не найдено” (потому что в статье было написано “React.js” и “performance”, а не “производительность”).

Так что нам не нравится в обычном поиске (Google или Яндекс):

Проблема #1: Буквоедство

  • Ищете “JavaScript” — находит только “JavaScript”.
  • Но не найдет “javascrpt” (опечатка), “JS”, “ECMAScript” или “жаваскрипт”.
  • Как будто поиск говорит: “Извини, нахожу то, что написано”.

Проблема #2: Скудный словарный запас

  • Ищете “машина” – не находит статьи со словом “автомобиль”.
  • Ищете “ошибка” – пропускает документы со словом “баг”.
  • Поиск не понимает, что “купить”, “покупка” и “приобрести” – это про одно и то же.

Проблема #3: Мешанина в результатах

  • Находит десятки сотни или даже тысячи результатов без объяснения порядка: почему статья 2019 года выше статьи 2024 года? Вы понимаете?
  • Часто нет фильтров – ищи иголку в стоге сена вручную.

Проблема #4: Медленный поиск

Поиск в базах данных, построенных на классических технологиях, может занимать достаточно много времени.

А теперь представьте поиск, который:

Понимает опечатки – “javascrpt” спокойно находит “JavaScript”.
Умно фильтрует – сначала отфильтрует выборку по разным критериям, а затем сделает по результату дополнительный поиск.
Работает мгновенно – результаты появляются быстрее, чем вы даже могли предположить.
✅ Может объяснить результаты – почему этот документ более релевантный, чем другой.
Знает синонимы – по слову “машина” находит статьи про “автомобиль” и “транспорт”.
Мультиязычность – по слову “project” находит статьи как с “project”, так и с “проект”.

Звучит как фантастика?

Нет, это Elasticsearch!


Как это работает?

🌈 Fuzzy Search (Поиск с нечёткой логикой) — когда поиск понимает очепятки

Fuzzy Search – это технология, которая находит результаты даже при опечатках, пропущенных буквах и прочих ‘творческих’ интерпретациях слов.

Как работает (простыми словами):

  • Система считает, сколько операций нужно, чтобы превратить одно слово в другое (Расстояние Левенштейна).
  • Операции: добавить букву, удалить букву, заменить букву.
  • Создает все возможные комбинации с 1-2 ошибками, ищет в индексе все сгенерированные варианты, сортирует по релевантности (точные совпадения выше).
  • Можно установить ‘префикс’ – количество букв, которые должны совпадать точно.
  • Чем меньше расстояние, тем выше шанс, что это то правильное слово.
  • Находит слова с пропущенными/лишними, переставленными буквами.

Факт: Fuzzy Search настолько полезен, что Google использует его уже 20+ лет. Помните ‘Возможно, вы искали…’? Это он и есть! Только теперь эта магия доступна в любом приложении, а не только в поисковиках. Больше никаких ‘Ничего не найдено’ из-за одной опечатки!

Впрочем, Fuzzy Search, хотя и имеется в арсенале ElasticSearch, это, все-таки, несколько побочный функционал. Разберём теперь основной.

🌈 BM25 – алгоритм, который решает, кто достоин быть первым

Что это такое:
BM25 (Best Matching 25) – это математическая формула, которая оценивает, насколько слово или документ релевантны вашему запросу. Более важным критериям даётся больший вес.

Факторы ранжирования результатов поиска Elasticsearch

Редкость слова в коллекции

Самый важный фактор.

  • Слово ‘и’ встречается везде – оно не поможет найти нужную статью. А слово ‘Elasticsearch’ – редкое и ценное!
  • Редкие слова получают больший вес, как редкие покемоны в игре.
Частота слов в документе:
  • Если слово встречается в документе 10 раз, он более релевантен запросу, чем тот, где оно упоминается 1 раз.
  • Но! Есть нюанс – после определенного количества повторений эффект снижается. Как с солью в супе – немного хорошо, много – испортит все.
Длина документа (плотность слова в документе):
  • В длинной статье слово может встретиться случайно, в короткой – скорее всего по теме.
  • BM25 это учитывает и ‘штрафует’ длинные документы.

Пример работы:

  • Запрос: “Свобода Независимость”
  • Документ A: упоминает “Свобода ” 5 раз, “Независимость” 3 раза, длина 1000 слов
  • Документ B: упоминает “Свобода ” 2 раза, “Независимость” 2 раза, длина 300 слов
  • BM25, скорее всего, поставит B выше A, потому что в коротком тексте высокая плотность ключевых слов важнее.

ElasticSearch на примере аналога книжного магазина

Представим себе большую компанию, имеющую книжные магазины.

— Каждый магазин имеет свои коллекции книг:

  • Художественные
  • Научные
  • Публистические
  • Учебники
  • Детские

— Каждая коллекция состоит из книг (томов).

— Каждая книга имеет какие-то характеристики. Например:

Книга, название: "Дюна"
  жанр: "фантастика",      ← измерение 1
  язык: "русский",         ← измерение 2
  год: 2021,               ← измерение 3
  цена: 890,               ← измерение 4
  издательство: "АСТ",     ← измерение 5
  рейтинг: 4.8,            ← измерение 6
  страниц: 704,            ← измерение 7
  формат: "твёрдый"        ← измерение 8

— Книги продаются в разных залах (отделах).


Терминология ElasticSearch

Как терминология ElasticSearch соотносится с нашим магазином?

NODE = Здание магазина (физический объект). Компания может иметь несколько магазинов в одном или разных городах.

INDEX = Вся коллекция “Детективы” (логическая коллекция книг). Коллекций в одном магазине может быть много.

SHARD = Зал, том из коллекции или энциклопедии (часть, физический объект)

SEGMENT = Отдельные тетради внутри тома или книги в зале (физические неизменяемые объекты)

Ключевое различие:
  • Node, Shard, Segment = физическая структура (где и как хранится)
  • Index, Facet = логическая структура (как организовано и как искать)

💥 Три кита Elasticsearch: Faceted, Semantic и Sharding

Пояснение к иностранным словам

Search – поиск.
Semantic = семантический, думаю, пояснять не требуется.
А вот с двумя другими ситуация сложнее.
Facet = ‘грань’, ‘категория’.
Shard = ‘осколок’, ‘кусок’.

Понятно, что дословный перевод мало что даст. Разве, что грубо-потолочно:
Sharding – разделение на осколки. Это точнее, чем разделение на куски. Ведь каждый осколок может иметь свойства общего целого, от чего откололся.
Faceted – разбитый на грани.
Далее примерьте этот общий смысл к более частному, применяемому в Elasticsearch.


🌈 1. Faceted Search в Elasticsearch — умные фильтры, которые знают всё

Что это такое простыми словами:

Faceted search — это система фильтров, которая до того, как ты что-то выберешь, уже даёт раскладку того, что есть.

Как пример: ищешь художественные книги:

Жанр:
  ☐ Фантастика(4655)
  ☐ Художественные(23643)
  ☐ Научные (212)

Сложность:
  ☐ Для детей (1345)
  ☐ Для взрослых (21568)
  ☐ Для профессионалов (253)

Язык:
  ☐ Русский (30)
  ☐ Английский (15)

Год издания, Издательство, Цена, Формат ...

Кликаешь по любому чек-боксу и счётчики мгновенно обновляются в соответствии с выбранными галками.

Каждый facet – это свойство (измерение).

Faceted search = навигация по N-мерному пространству данных через интерактивные фильтры и проекции.

Это объясняет, почему faceted search так мощен и гибок — он работает со всем богатством многомерной структуры данных одновременно!


🌈 2. Semantic Search в Elasticsearch — поиск, который понимает смысл

Что это такое простыми словами:

Semantic search — это когда поиск понимает смысл слов, а не просто сравнивает буквы. Ты пишешь “машина”, а он знает, что “автомобиль”, “авто”, “тачка” — это также про одно и то же.

Разберется, когда слово ‘банка’ относится к жестянке, когда к сиденью на шлюпке, а когда – к отмели на реке.

Как это работает (упрощённо):

Система превращает свойства слов (книг, документов) в математические координаты (векторы). Мы легко можем посчитать расстояния между двумя точками (геометрия) или расстояния в реальном 3-хмерном пространстве. Точно также можно посчитать расстояние в пространстве, в котором N измерений (facets).
Близость слов в таком пространстве определяет, насколько два слова (книги) похожи по смыслу.


🌈 3. Sharding в Elasticsearch — как разделить большое на осколки, похожие на целое

Что это такое простыми словами:

Sharding — это разделение огромной кучи данных (коллекции) на шарды (отдельные кусочки (залы, книги, тома)), в которых можно легко найти нужное.

Магия в деталях:

Без шардирования: это огромный магазин, в котором:

  • Все книги в нём одном
  • Перестало хватать места — всё, конец
  • Магазин сгорел — всё пропало

С шардингом Elasticsearch:

  • 10 (например) магазинов
  • Книги распределены между ними
  • Каждый магазин отвечает за свои коллекции
  • Что-то случилось с одним из них – остальные 9 работают
  • Поиск идёт параллельно во всех – быстрее

Когда ты ищешь “Войну и мир”:

  1. Запрос уходит во все книжные магазины одновременно
  2. Каждый магазин ищет у себя
  3. Результаты собираются в один список
  4. Ты получаешь финальный ответ

Зачем это нужно:

  • Горизонтальное масштабирование — мало места? Добавь ещё магазин
  • Скорость — параллельный поиск быстрее последовательного
  • Надёжность — один магазин сгорел? Остальные работают. Чтобы это работало , настраивают реплики – копии шардов
  • Обход лимитов — появилось новое направление? Создай новую коллекцию.

Как связаны все три кита

Теперь самое интересное — эти три механизма работают вместе и усиливают друг друга.

Связка 1: Faceted + Sharding

Сценарий: У тебя интернет-магазин с 50 миллионами товаров, распределёнными по 10 залам (шардам).

Пользователь открывает страницу с фильтрами.

Что происходит под капотом:

  1. Elasticsearch посылает запрос на все 10 шардов параллельно
  2. Каждый шард считает свои локальные значения
  3. Координирующий узел суммирует результаты
  4. Фасеты показывают финальные цифры в разных разрезах

Без шардирования: один бедный сервер считал бы 50 млн товаров последовательно — несколько секунд.

С шардингом: 10 серверов считают по 5 млн параллельно — доли секунды.

Магия: чем больше шардов, тем быстрее faceted counts. Но есть предел — слишком много шардов = перегрузка от координации.


Связка 2: Semantic + Sharding

Сценарий: Поиск по базе знаний с 100 миллионами документов, 20 шардов, семантический поиск включён.

Пользователь ищет “Войну и мир”.

Что происходит:

  1. Запрос превращается в семантический вектор (набор чисел)
  2. Вектор отправляется на все 20 шардов параллельно
  3. Каждый шард:
    • Ищет документы с похожими векторами (не только “Войну и мир”, но и “Л. Н. Толстого”, “Русская литература”)
    • Находит топ-100 в своём куске
  4. Координатор собирает все 20×100 = 2,000 результатов → используя встроенную систему scoring получает финальные топ-100

Проблема без шардирования: семантический поиск по 100 млн векторов на одном сервере = медленно и нужно много памяти.

Решение с шардингом Elasticsearch: каждый шард обрабатывает только 5 млн документов. Параллельно. Быстро.

Важная деталь: семантический поиск вычислительно дороже обычного (сравнение векторов вместо обычной проверки). Замедление при шардировании может оказаться критичным для производительности.
Однако, семантический поиск многогранен. Его можно настроить в более упрощённых вариантах, не сказывающихся на производительности.


Связка 3: Semantic + Faceted

Сценарий: Пользователь ищет книги и использует фильтры + семантический поиск.

Запрос: “Фэнтези” + Фильтр “Американская литература”

Что происходит:

  1. Semantic search находит все релевантные документы (книги) по смыслу (не только с точным текстом)
  2. Faceted search параллельно вычисляет счётчики для фильтров:
    • Рэй Бредбери: 45
    • Гарри Гаррисон: 33
    • Роджер Желязны: 167
  3. Пользователь выбирает “Желязны”
  4. Финальный результат: 167 книг про жанра Фэнтэзи, с американским автором Роджер Желязны

Магия: faceted показывает точные цифры по семантически найденным документам (книгам), а не только по полному совпадению ключевых слов.


Связка 4: Все три вместе (полная картина)

Реальный кейс: Netflix ищет фильмы для рекомендаций.

База данных:

  • 100 миллионов записей о просмотрах
  • Распределены по 50 шардам
  • Семантический поиск для понимания предпочтений

Пользователь: “покажи что-то про космос”
Процесс:

1️⃣ Semantic поиск понимает: “космос” = “space” = “галактики” = “звёзды” = “sci-fi”
2️⃣ Запрос идёт на все 50 шардов параллельно
3️⃣ Каждый шард ищет семантически похожие фильмы в своих 2 млн записей и возвращает топ-100
4️⃣ Faceted механизм параллельно считает:

  • Жанры: Фантастика (234), Документальный (45), Боевик (67)
  • Год: 2020-2024 (89), 2015-2019 (123), старше (22)
  • Рейтинг: 8+ (56), 7-8 (134), <7 (44)

5️⃣ Координатор:

  • Собирает 50×100 = 5,000 кандидатов
  • Сортирует по релевантности (semantic score)
  • Показывает топ-20 + фасеты с точными счётчиками

6️⃣ Пользователь кликает фильтр “Рейтинг 8+” → мгновенный пересчёт, только высокорейтинговые космические фильмы

Результат: быстро (благодаря шардингу), точно (благодаря семантике), удобно (благодаря фасетам).


Summary связок

СвязкаКак работаетЗачем это нужно
Faceted + ShardingКаждый шард считает свои счётчики, координатор суммируетБыстрый подсчёт фасетов для огромных датасетов
Semantic + ShardingСемантический поиск параллельно на всех шардахВычислительно дорогой semantic становится приемлемо быстрым
Semantic + FacetedФасеты показывают счётчики для семантически найденных документовБольше релевантных результатов + точные цифры
Все триSemantic находит по смыслу, Sharding делает быстро, Faceted фильтрует удобноProduction-ready поисковая система

Для тех, кому интересно немного более глубокое техническое понимание, можете заглянуть сюда: Что такое шардинг (sharding) в Elasticsearch? Как работает Apache Lucene index?

А вы знали?

Скорость света:

  • Сигнал от Москвы до Владивостока идет ~30ms
  • Elasticsearch может найти результат примерно также быстро!

Человеческая реакция:

  • Мозг воспринимает как “мгновенно” все, что быстрее 100ms
  • Медленнее, чем 100ms = пользователь начинает замечать задержку

Google стандарт:

  • Google считает 200ms “медленным” поиском
  • Elasticsearch легко укладывается в эти рамки

Забавный факт: Real-time поиск Elasticsearch настолько быстрый, что главная проблема – это скорость набора текста пользователем. Elasticsearch намного шустрее!
Система находит результаты быстрее, чем человек успевает сформулировать мысль. Это как иметь помощника, который отвечает на вопросы раньше, чем вы их задали!

Некоторые практические применения Elasticsearch

Мощная система гибкого поиска для разного рода приложений

  • Быстрый и гибкий поиск по разным критериям и их комбинациям
  • Мгновенные фильтры и сортировки
Логи и мониторинг:
  • Новые ошибки появляются в дашборде мгновенно
  • Поиск по миллионам логов за миллисекунды
  • Разработчика программного обеспечения не седеют от ожидания
Социальные сети:
  • Поиск по людям/постам в реальном времени
  • Новые посты сразу попадают в поиск
  • Тренды обновляются мгновенно

Практические применения Elasticsearch, которые не лежат на поверхности

Бизнес и аналитика:

Незаменимая вещь для поиска аналогичных товаров или предметов.

Трейдинг:

Об этом практически никто не знает: систему поиска Elasticsearch можно настроить так, чтобы она показывала закономерности в поведении стоимости ценных бумаг, а трейдеру остаётся только принимать решения.


Демо реализации поисковой системы ElasticSearch

Некоторую иллюстрация работы поисковой системы ElasticSearch можно посмотреть <<= здесь.
Правда, семантический поиск здесь реализован в самом простейшем виде, по однокоренным словам и по их аналогам на английском. Самого впечатляющего здесь не видно. В будущем будет пример поинтереснее.

Выводы простыми словами

Fuzzy search прощает опечатки и делает поиск человечнее. Semantic search понимает смысл, а не просто буквы. Faceted search даёт пользователям контроль и показывает возможности до клика. BM25 ранжирует результаты по релевантности. Sharding распределяет данные для скорости и масштабирования. Робеспечивают надёжность.

Но главное — все эти механизмы работают вместе. Semantic находит по смыслу, Sharding делает это быстро на миллионах документов, Faceted позволяет уточнить результаты, BM25 выдаёт самое релевантное первым, а Fuzzy страхует от случайных опечаток.

Вместе они превращают Elasticsearch из просто базы данных в мощную поисковую платформу, которая понимает смысл, работает быстро и удобна в использовании.

Каждый механизм сам по себе полезен, но магия происходит, когда они работают вместе.

Также может быть интересно: