Полное руководство по полнотекстовому поиску в Laravel

Рассмотрим, как использовать функции поиска в Laravel. Начнем с описания преимуществ полнотекстового поиска, а затем пошагово разберем настройку в Laravel-приложении.

🔎 Зачем использовать полнотекстовый поиск?

  • Гибкость совпадений: Традиционные базы данных ищут точные совпадения, а полнотекстовый поиск находит данные по частичному совпадению текста.
  • Удобство интерфейса: Дает пользователям толерантность к опечаткам, поиск по префиксам и синонимы.
  • Улучшение находимости: Помогает людям находить нужную информацию, даже если они не знают точных формулировок.

🛠 Как внедрить поиск в Laravel## 1. Установка Laravel Scout

Laravel поддерживает полнотекстовый поиск «из коробки» с помощью официального пакета Laravel Scout.
Установите Scout через Composer в терминале вашего проекта:

composer require laravel/scout

После установки опубликуйте файл конфигурации config/scout.php с помощью команды Artisan:

php artisan vendor:publish --provider="Laravel\Scout\ScoutServiceProvider"

2. Настройка драйвера Meilisearch

Meilisearch — это быстрый поисковый движок с открытым исходным кодом, написанный на Rust. Использование специализированного драйвера снимает ограничения обычных SQL-баз.
Сначала установите необходимую зависимость для интеграции Scout и Meilisearch:

composer require meilisearch/meilisearch-php http-interop/http-factory-guzzle

Затем обновите переменные окружения в вашем файле .env:

SCOUT_DRIVER=meilisearch
MEILISEARCH_HOST=http://127.0.0.1:7700
MEILISEARCH_KEY=masterKey

(Примечание: Если вы используете среду разработки Laravel Sail, хост по умолчанию будет http://meilisearch:7700 из-за особенностей работы сети Docker Bridge).
Для продакшена рекомендуется использовать управляемый сервис Meilisearch Cloud, где URL хоста можно скопировать в настройках проекта.

3. Подключение моделей Eloquent

Чтобы сделать модель доступной для поиска, добавьте в нее трейт Laravel\Scout\Searchable. Наблюдатели моделей (observers) будут автоматически синхронизировать данные с Meilisearch при любых изменениях в БД.
Пример настройки модели:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Laravel\Scout\Searchable;

class Contact extends Model
{
    use Searchable;
}

Вы можете использовать метод toSearchableArray, чтобы точно указать, какие поля (включая данные из связанных таблиц) должны отправляться в индекс:

public function toSearchableArray(): array
{
    return [
        'id' => (int) $this->id,
        'name' => $this->name,
        'email' => $this->email,
        'company_name' => $this->company_name,
        // Пример добавления связи:
        'organization' => $this->organization ? [
            'id' => $this->organization->id,
            'name' => $this->organization->name,
        ] : null,
    ];
}

4. Настройка фильтрации и сортировки

Чтобы использовать продвинутые фильтры и сортировку в Meilisearch, укажите нужные атрибуты в конфигурационном файле config/scout.php в блоке настроек индексов:

'meilisearch' => [
    'host' => env('MEILISEARCH_HOST', 'http://localhost:7700'),
    'key' => env('MEILISEARCH_KEY'),
    'index_settings' => [
        App\Models\Contact::class => [
            'filterableAttributes' => ['organization_id'],
            'sortableAttributes' => ['name', 'company_name'],
        ],
    ],
],

Чтобы применить эти настройки и отправить их в Meilisearch, выполните Artisan-команду:

php artisan scout:sync-index-settings

💡 Пример реализации

Разработчики подготовили демонстрационное SaaS-приложение (CRM-систему) с открытым исходным кодом, чтобы показать полнотекстовый поиск в действии. В демо используются следующие возможности:

  • Мульти-поиск (одновременный поиск по разным индексам).
  • Мультиарендность (Multi-tenancy / изоляция данных пользователей).
  • Различные сценарии фильтрации и сортировки результатов.

Код проекта доступен в репозитории на GitHub: meilisearch/saas-demo.

🗒 Часто задаваемые вопросы (FAQ)

  • Что такое Laravel Scout?
    Это официальный пакет Laravel для интеграции полнотекстового поиска в модели Eloquent. Он автоматически обновляет поисковые индексы при изменении записей в базе данных.
  • Почему стоит выбрать Meilisearch в качестве драйвера для Scout?
    Стандартный драйвер базы данных имеет ограничения (отсутствие релевантности, не учитывает опечатки). Meilisearch «из коробки» предоставляет высокую скорость, исправление опечаток, поиск по префиксам и синонимам.
  • Как применить новые параметры фильтрации или сортировки?
    Сначала пропишите их в массиве конкретной модели в файле config/scout.php, после чего выполните команду php artisan scout:sync-index-settings для отправки конфигурации в поисковой движок.