Настройка 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 недели. Стоимость рассчитывается индивидуально после оценки объёма данных и сложности.
Готовы взяться за ваш проект. Свяжитесь с нами — мы подготовим архитектурное решение и точную оценку. Получите консультацию, оставив заявку.







