Laravel Scout и драйверы: как выбрать движок поиска
Database, Meilisearch, Typesense или Algolia — четыре драйвера Scout ведут себя по-разному под нагрузкой и по деньгам. Разбираем, где каждый ломается и что выбрать под ваш проект.

Вы подключили Laravel Scout, добавили трейт Searchable к модели и на тестовой базе поиск работает идеально. На продакшене с 400 000 записей запрос по строке начинает отдавать результаты за 2-3 секунды, а иногда индексация в очереди отваливается по таймауту. Причина почти всегда одна: драйвер выбран не под задачу. Scout — это только обёртка, а реальную работу делает движок за ним, и движки различаются радикально.
Разберём четыре драйвера, которые Scout поддерживает официально в версии 10.x: database, Meilisearch, Typesense и Algolia. У каждого своя цена — в деньгах, в задержке и в том, что придётся держать на своём сервере. Статья про выбор драйвера, а не про настройку конкретного движка: тонкости индексации Meilisearch или синонимы в Typesense — отдельные темы.
Что Scout делает, а что нет
Scout синхронизирует записи Eloquent-моделей с поисковым индексом и превращает Model::search('текст') в запрос к движку. Он не умеет полнотекстовый поиск сам по себе — он делегирует. Всё, что Scout берёт на себя:
- подписка на события модели (created, updated, deleted) и обновление индекса;
- очередь для массовой индексации через
ShouldQueue; - единый API поиска поверх разных бэкендов;
- методы
toSearchableArray()для контроля, какие поля попадают в индекс.
Отсюда первое следствие: если движок настроен плохо, Scout это не спасёт. И второе: сменить драйвер в теории — это правка одной строки в config/scout.php и переиндексация. На практике модели токенизации и правила ранжирования у движков разные, поэтому результаты поиска после смены драйвера будут отличаться.
Четыре драйвера и их цена
Database — когда движок не нужен
Драйвер database появился в Scout начиная с версии 9 и не требует никакого внешнего сервиса. Он строит запросы прямо к вашей СУБД через LIKE или полнотекстовые индексы, если они настроены. Ноль инфраструктуры, ноль абонентской платы.
Цена — производительность и качество. По умолчанию поиск идёт через WHERE column LIKE '%текст%', а такой запрос не использует обычный B-tree индекс и приводит к полному сканированию таблицы. На десятках тысяч строк это терпимо, на сотнях тысяч — уже нет. Опечаток он не прощает, релевантность не ранжирует.
Драйвер database хорош ровно до того момента, пока поиск не стал функцией, за которую держится продукт. Как только пользователь ждёт от строки поиска большего, чем точное вхождение — пора смотреть на специализированный движок.
Meilisearch — self-hosted по умолчанию
Meilisearch — открытый поисковый движок на Rust, который вы разворачиваете сами (Docker-образ или бинарник). Официально поддерживается Scout и рекомендуется в документации Laravel как основной вариант для полнотекстового поиска с опечатками и релевантностью из коробки.
Что получаете: поиск по префиксу, устойчивость к опечаткам (typo tolerance), фильтрацию и ранжирование, ответ обычно в пределах десятков миллисекунд. Что платите: свой сервер под движок, память под индекс (индекс держится в памяти для скорости), обслуживание и мониторинг. Для интеграции нужен пакет meilisearch/meilisearch-php и HTTP-клиент.
Typesense — альтернатива с открытым кодом
Typesense — ещё один открытый движок, поддержка которого добавлена в Scout в версии 10. По духу близок к Meilisearch: опечатки, фильтры, гео-поиск, self-hosted или облако вендора. Разница в деталях: у Typesense жёсткая типизация схемы коллекции, которую нужно объявить, и своя логика ранжирования. Для Laravel требуется пакет typesense/typesense-php.
Выбор между Meilisearch и Typesense чаще решается не производительностью (обе быстры), а тем, чья схема настройки и документация вам ближе и что уже развёрнуто в вашей инфраструктуре.
Algolia — managed, платно
Algolia — коммерческий SaaS. Вы не держите ничего у себя: индекс живёт в облаке Algolia, запросы идут напрямую туда, в том числе с фронтенда через их JS-библиотеку. Это исходный драйвер, под который Scout когда-то и создавался.
Плюс — нулевые заботы об инфраструктуре и отработанный поиск-as-you-type. Минус — цена, которая растёт с числом записей и поисковых операций, и то, что данные индекса уходят к вендору. Тарифы Algolia меняются, актуальные лимиты и стоимость операций сверяйте на их сайте перед тем, как закладывать в бюджет.
Сравнение
| Драйвер | Инфраструктура | Опечатки и ранжирование | Стоимость | Когда подходит |
|---|---|---|---|---|
| database | только ваша СУБД | нет | бесплатно | до ~десятков тысяч записей, точный поиск |
| Meilisearch | свой сервер | да, из коробки | своё железо | полнотекст с опечатками, контроль над данными |
| Typesense | свой сервер или облако | да | своё железо или SaaS | то же, если ближе его модель схемы |
| Algolia | нет, SaaS | да | подписка, растёт с объёмом | не хотите держать движок, готовы платить |
Как переключить драйвер
Драйвер задаётся переменной окружения и конфигом. Пример для Meilisearch в Scout 10.x:
// .env
SCOUT_DRIVER=meilisearch
MEILISEARCH_HOST=http://127.0.0.1:7700
MEILISEARCH_KEY=YOUR_MASTER_KEY
// config/scout.php читает эти значения
// значение по умолчанию берётся из env('SCOUT_DRIVER', 'algolia')Для драйвера database и Meilisearch нужны свои composer-пакеты. Проверяйте актуальные имена и версии в документации Scout вашей версии — состав зависимостей менялся между релизами. Модель помечается трейтом:
use Laravel\Scout\Searchable;
class Product extends Model
{
use Searchable;
// Какие поля уходят в поисковый индекс.
// Не индексируйте всё подряд — только то, по чему ищут.
public function toSearchableArray(): array
{
return [
'id' => $this->id,
'name' => $this->name,
'description' => $this->description,
];
}
}После смены драйвера индекс нужно построить заново — команда php artisan scout:import "App\Models\Product". Старый индекс предыдущего движка при этом не удаляется автоматически.
Когда что выбирать
- Точный поиск по небольшой таблице (теги, категории, справочник до десятков тысяч строк) —
database. Не тащите движок ради того, что решаетLIKE. - Поиск — заметная функция продукта, данные держите у себя — Meilisearch или Typesense. Готовьтесь выделить сервер и память под индекс.
- Не хотите администрировать движок и бюджет позволяет — Algolia. Особенно если нужен поиск-as-you-type прямо с фронтенда.
Что ломается на практике
- Индексация в синхронном режиме тормозит запись. Без
SCOUT_QUEUE=trueкаждое сохранение модели дёргает движок в том же запросе. Включайте очередь и держите воркер живым. - Массовый импорт валит движок или упирается в лимит SaaS.
scout:importгрузит батчами; размер батча настраивается, но по умолчанию может быть агрессивным для слабого сервера Meilisearch. - Поле, по которому фильтруете, не объявлено фильтруемым. Meilisearch и Typesense требуют явно указать filterable-атрибуты в настройках индекса — иначе фильтр молча не работает.
- Забыли, что soft-deleted записи по умолчанию остаются в индексе, если не включён
SCOUT_SOFT_DELETE. Пользователь находит удалённое.
Что настроить дальше
После выбора драйвера займитесь тремя вещами: включите очередь индексации и мониторьте её лаг (задержка между записью в БД и появлением в поиске); настройте filterable- и sortable-атрибуты под реальные запросы; замерьте p95 задержки поиска на боевом объёме данных, а не на дампе из десяти строк. Синонимы, стоп-слова и тонкая настройка ранжирования — следующий уровень, к которому стоит переходить, когда базовый поиск уже стабильно отдаёт релевантное.
Поиск источников: Реальные статьи и книги со ссылками, библиография по ГОСТ
Спросить за 15 ₽Источники: Laravel Scout — официальная документация, Meilisearch documentation
Частые вопросы
А если у меня Scout другой версии, эти драйверы будут?
Поиск ничего не находит после переключения драйвера — что делать?
Можно ли обойтись драйвером database без внешнего движка?
Почему индексация висит или падает по таймауту?
Данные уходят в облако при использовании Algolia — это безопасно?
Материал носит информационный характер и подготовлен редакцией «Агентуры». Он не является офертой, рекламой или индивидуальной консультацией. Упомянутые продукты, компании и торговые знаки принадлежат их правообладателям. Перед принятием решений, влекущих юридические или финансовые последствия, обратитесь к профильному специалисту.