Внедрение Meilisearch на Laravel

Внедрение поискового движка Meilisearch на Laravel с использованием библиотеки laravel/scout

LaravelПоискScoutMeilisearchОптимизация

От проблемы к результату

Как мы решали конкретную задачу клиента и что получилось.

Проблема

У клиента был большой внутренний каталог, а база данных MySQL располагалась на отдельном сервере, из-за чего каждый сетевой запрос добавлял задержку. Поиск работал через тяжёлые SQL-запросы (LIKE без индексов и полный перебор таблиц), из-за чего при росте каталога и одновременной работе нескольких менеджеров база просто не справлялась с нагрузкой.

Из-за этого страницы каталога загружались по 6 - 8 секунд, а поиск требовал абсолютной точности: любые опечатки или перестановки слов приводили к пустой выдаче. Менеджерам приходилось тратить много времени на ручной перебор вариантов и повторные запросы, чтобы найти нужный товар.

Решение

Проанализировав оптимизацию MySQL, Meilisearch и Elasticsearch, мы выбрали Meilisearch как оптимальный баланс скорости внедрения, качества поиска и стоимости эксплуатации. Движок развернули в отдельном Docker-контейнере и интегрировали через Laravel Scout, что обеспечило автоматическую синхронизацию данных при любых изменениях в базе без лишних затрат на инфраструктуру и DevOps.

В рамках реализации мы проиндексировали все сущности каталога, перевели фильтрацию, пагинацию и счётчики напрямую в Meilisearch и настроили фоновую очередь для точечного обновления индексов. Дополнительно внедрили умный подсказчик с навигацией и подсветкой совпадений, настроили синонимы и строгий поиск по артикулам для удобства пользователей.

Результат

В результате загрузка основного каталога ускорилась с 8 секунд до 1, а поиск и открытие страниц стали работать в среднем в 2 - 4 раза быстрее. Менеджеры получили удобный инструмент с мгновенными подсказками, который легко находит нужные товары даже при наличии опечаток или неточном знании артикула.

Нагрузка на основную базу MySQL радикально снизилась, так как все тяжёлые запросы и фильтрация перешли в Meilisearch, освободив ресурсы сервера для импорта, расчётов и выгрузок. Независимое контейнерное развертывание поиска позволило легко масштабировать систему при необходимости, а мониторинг движка был встроен в существующую систему уведомлений.

8 -> 1
секунд
время поиска по основному каталога, ускорение в 8 раз
2 - 4
раза быстрее
поиск и загрузка страниц в среднем
0
запросов к БД
поисковые запросы больше не взаимодействуют с базой данных
< 50
мс
скорость запроса к поисковому движкуу
Как это работает

Этапы реализации

Подключение Scout и Meilisearch

Установка Laravel Scout и PHP - клиент Meilisearch, добавили конфигурацию, переменные окружения и отдельный контейнер для поискового движка

1

Индексация основных сущностей

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

2

Перенос выдычи в Meilisearch

Перевели основные страницы на получение результатов, пагинации, сортировок, фильтров и счетчиков из Meilisearch, минимизировав количество запросов к удаленной БД

3

Синхронизация индексов

Добавили точечное обновление индексов после изменения основных сущностей, включая массовые операции. Настроили эту на работу на очередях

4

Улучшили интерфейс поиска

Добавили единый подсказчик на всех поисковых полях, добавили навигацию клавиатурой, типы результатов, подсветку совпадений. Настроили синонимы и строгий поиск артикулов

5

Эксплуатация и надежность

Добавили возможность проверки статуса поисковой системы, мониторинг, уведомления через бота в telegram с инструкцией по восстановлению работы

6

Почему 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-приложений среднего масштаба, где нужен быстрый и умный поиск без раздувания инфраструктуры.