
Внедрение Meilisearch на Laravel
Внедрение поискового движка Meilisearch на Laravel с использованием библиотеки laravel/scout
От проблемы к результату
Как мы решали конкретную задачу клиента и что получилось.
Проблема
У клиента был большой внутренний каталог, а база данных MySQL располагалась на отдельном сервере, из-за чего каждый сетевой запрос добавлял задержку. Поиск работал через тяжёлые SQL-запросы (LIKE без индексов и полный перебор таблиц), из-за чего при росте каталога и одновременной работе нескольких менеджеров база просто не справлялась с нагрузкой.
Из-за этого страницы каталога загружались по 6 - 8 секунд, а поиск требовал абсолютной точности: любые опечатки или перестановки слов приводили к пустой выдаче. Менеджерам приходилось тратить много времени на ручной перебор вариантов и повторные запросы, чтобы найти нужный товар.
Решение
Проанализировав оптимизацию MySQL, Meilisearch и Elasticsearch, мы выбрали Meilisearch как оптимальный баланс скорости внедрения, качества поиска и стоимости эксплуатации. Движок развернули в отдельном Docker-контейнере и интегрировали через Laravel Scout, что обеспечило автоматическую синхронизацию данных при любых изменениях в базе без лишних затрат на инфраструктуру и DevOps.
В рамках реализации мы проиндексировали все сущности каталога, перевели фильтрацию, пагинацию и счётчики напрямую в Meilisearch и настроили фоновую очередь для точечного обновления индексов. Дополнительно внедрили умный подсказчик с навигацией и подсветкой совпадений, настроили синонимы и строгий поиск по артикулам для удобства пользователей.
Результат
В результате загрузка основного каталога ускорилась с 8 секунд до 1, а поиск и открытие страниц стали работать в среднем в 2 - 4 раза быстрее. Менеджеры получили удобный инструмент с мгновенными подсказками, который легко находит нужные товары даже при наличии опечаток или неточном знании артикула.
Нагрузка на основную базу MySQL радикально снизилась, так как все тяжёлые запросы и фильтрация перешли в Meilisearch, освободив ресурсы сервера для импорта, расчётов и выгрузок. Независимое контейнерное развертывание поиска позволило легко масштабировать систему при необходимости, а мониторинг движка был встроен в существующую систему уведомлений.
Этапы реализации
Подключение Scout и Meilisearch
Установка Laravel Scout и PHP - клиент Meilisearch, добавили конфигурацию, переменные окружения и отдельный контейнер для поискового движка
Индексация основных сущностей
Подключили к индексам товары каталога, товары поставщиков, бренды и прочие сущности. По необходимости реализовывали расширенные модели для чтения
Перенос выдычи в Meilisearch
Перевели основные страницы на получение результатов, пагинации, сортировок, фильтров и счетчиков из Meilisearch, минимизировав количество запросов к удаленной БД
Синхронизация индексов
Добавили точечное обновление индексов после изменения основных сущностей, включая массовые операции. Настроили эту на работу на очередях
Улучшили интерфейс поиска
Добавили единый подсказчик на всех поисковых полях, добавили навигацию клавиатурой, типы результатов, подсветку совпадений. Настроили синонимы и строгий поиск артикулов
Эксплуатация и надежность
Добавили возможность проверки статуса поисковой системы, мониторинг, уведомления через бота в telegram с инструкцией по восстановлению работы
Почему Meilisearch
Перед началом работ мы рассмотрли три подхода к ускорению поиска:
Вариант 1 - Оптимизация MySQL FULLTEXT
Самый быстрый в реализации: добавить индексы, переписать запросы. Но MySQL FULLTEXT не поддерживает поиск с опечатками, не даёт подсказок при вводе, а при росте каталога база всё равно остаётся узким местом. Каждый поисковый запрос конкурирует за ресурсы с основными операциями.
Вариант 2 - Laravel Scout + Meilisearch
Специализированный поисковый движок, созданный именно для задач e-commerce и каталогов. Встроенная tolerant-логика находит результаты при опечатках и перестановке слов. Фасетные фильтры и счётчики работают из коробки. Для Laravel-проектов это один из лучших выборов: официальный пакет Scout обеспечивает прозрачную синхронизацию, а сам движок запускается в одном Docker-контейнере и потребляет минимум ресурсов. Не нужен отдельный DevOps - достаточно стандартного деплоя.
Вариант 3 - OpenSearch / Elasticsearch
Мощное enterprise-решение с расширенной аналитикой, персонализацией и мультиязычностью. Но для среднего каталога это избыточно: требует выделенного сервера с большим объёмом RAM, сложнее в настройке и поддержке, увеличивает время внедрения в 2–3 раза.
Итог: для данного проекта Meilisearch оказался оптимальным по соотношению скорость внедрения / качество поиска / стоимость эксплуатации. Это один из лучших вариантов для Laravel-приложений среднего масштаба, где нужен быстрый и умный поиск без раздувания инфраструктуры.