Налаштування Elasticsearch для пошуку в мобільному додатку
Уявіть інтернет-магазин з 10 000 товарів. Користувач вводить «кросівки Adidas» — додаток зависає на 5 секунд, а потім показує порожній список через повільний LIKE-запит. Конверсія падає. Ми стикаємося з цим на кожному другому проєкті. Наша команда з 5-річним досвідом роботи з Elasticsearch і понад 30 реалізованих проєктів налаштовує пошук під ключ: від індексації даних до готового UI з автодоповненням і фасетами. Гарантуємо, що час відповіді не перевищує 200 мс навіть при мільйоні документів.
Чому Elasticsearch, а не LIKE-пошук?
LIKE в SQLite (або аналогічних базах) не вміє ранжувати результати, не підтримує морфологію і гальмує на обсягах понад тисячу записів. Elasticsearch забезпечує повнотекстовий пошук, автодоповнення, фасетні фільтри та релевантність за десятками факторів. Різниця в швидкості — до 50 разів швидше для складних запитів, що критично важливо для конверсії в e-commerce. Наприклад, пошук «кросівки» знайде і «кросівок», і «кросівками» за мілісекунди.
Архітектура: мобільний додаток не звертається до ES напряму
Мобільний клієнт надсилає запит на backend: GET /api/search?q=кросівки&category=sport. Backend (Laravel/Node) виконує пошук в Elasticsearch і повертає пагіновану відповідь. Причини:
- Безпека: структура індексу та облікові дані недоступні клієнту.
- Кешування: сервер кешує популярні запити, скорочуючи навантаження на ES.
- Контроль навантаження: тисяча одночасних клієнтів не перевантажує кластер.
| Критерій | LIKE | Elasticsearch |
|---|---|---|
| Час запиту (1 млн рядків) | > 5 с | < 200 мс |
| Морфологія | ні | повноцінна |
| Ранжування | ні | за релевантністю |
Налаштування індексу
Для російського тексту обов'язковий морфологічний аналізатор. Використовуємо вбудований russian або плагін analysis-morphology. Без нього запит «кросівки» не знайде «кросівок» або «кросівка». Приклад мапінгу:
{ "mappings": { "properties": { "name": { "type": "text", "analyzer": "russian", "fields": { "keyword": { "type": "keyword" } } } } } } Поле keyword необхідне для сортування та агрегацій — text для цього непридатне.
| Аналізатор | Морфологія | Продуктивність | Ліцензія |
|---|---|---|---|
| russian | + | висока | вбудований |
| analysis-morphology | ++ | середня | плагін |
Elasticsearch — стандарт індустрії, для російськомовного контенту переважний russian.
Як реалізувати автодоповнення та пагінацію?
Автодоповнення (search-as-you-type) реалізується через поле типу search_as_you_type або completion suggester. Клієнт надсилає запит при кожному введенні з debounce 300 мс, сервер повертає до 7 підказок. Для пагінації використовуємо search_after замість стандартного from/size, яке обмежене 10 000 результатів. Це дозволяє реалізувати нескінченний скрол без необхідності кнопки «наступна сторінка».
Як ми налаштовуємо пошук для клієнтів?
Наш процес включає п'ять етапів:
- Аналіз даних: вивчаємо структуру товарів, визначаємо поля для індексації, нормалізуємо атрибути.
- Проектування індексу: вибираємо аналізатори, налаштовуємо мапінг та автооновлення через logstash або Kafka.
- Реалізація API: створюємо endpoint з пагінацією (
search_after), фасетами та автодоповненням. Документуємо в Swagger. - Інтеграція в мобільний додаток: підключаємо API, малюємо UI (skeleton, debounce, нескінченний скрол). Нативні SDK (Alamofire, Retrofit) обробляють запити.
- Тестування та моніторинг: перевіряємо швидкість (<500 мс), включаємо slowlog, налаштовуємо алерти в Kibana.
Розберемо типовий кейс. Клієнт — маркетплейс з 50 000 товарів. Elasticsearch кластер з 3 нод, індексація через Kafka. Після інтеграції середній час відповіді впав з 3 с до 150 мс, кількість покинутих кошиків знизилася на 30%. Для цього довелося налаштувати аналізатор russian з кастомним словником стоп-слів і додати boosting за рейтингом товару.
Що входить в роботу?
- Документація з архітектури пошуку та схем запитів.
- Доступи до сервера Elasticsearch та налаштований моніторинг (Kibana, Grafana).
- Вихідний код backend-контролера з прикладами запитів (REST, GraphQL).
- Навчання команди: як оновлювати індекс, додавати поля, змінювати релевантність.
- Підтримка протягом місяця після запуску.
Моніторинг та продуктивність
Повільні запити (>500 мс) логуємо через slowlog Elasticsearch. У мобільному додатку показуємо skeleton-заглушки, при затримці >3 с — повідомлення «Пошук займає більше часу». Базові метрики: середній час відповіді <200 мс, відсоток помилок <0.5%.
Строки та вартість
Базова інтеграція (індекс + API + UI пошуку) займає 1–2 тижні. Повний набір (фасети, автодоповнення, офлайн-кеш) — 3–4 тижні. Вартість розраховується індивідуально після оцінки обсягу даних та складності.
Готові взятися за ваш проєкт. Зв'яжіться з нами — ми підготуємо архітектурне рішення та точну оцінку. Отримайте консультацію, залишивши заявку.







