Простая интеграция поискового движка Manticore Search с фреймворком Laravel при помощи Laravel Scout и неофициального драйвера manticore-scout-engine.

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

  • Элементарная установка и настройка.

  • Удобный индексатор данных. Не надо писать свой для RT таблиц.

  • Автоматическое управление индексами при манипуляциях с базой данных.

  • Простой поиск с базовыми возможностями и даже чуточку больше.

Переходим к действиям.

Устанавливаем manticore

Устанавливаем необходимые библиотеки

composer require laravel/scout
composer require romanstruk/manticore-scout-engine

Добавляем файлы конфигурации в папку configs

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

В .env указываем нужный драйвер

SCOUT_DRIVER=manticore

Настройки модели

Для каждой таблицы базы данных будет своя таблица-индекс в мантикоре.

В модели, для которой необходим поиск, нужно определить поля, их типы и настройки таблиц-индексов для manticore в методе scoutIndexMigration.

Помимо этого, нужно определить toSearchableArray, чтобы указать какие данные будут сохраняться в мантикору. Здесь же, при необходимости, можно модифицировать эти данные. Если этого не сделать, то scout будет пытаться сохранить все данные из таблицы, от этого могут возникать ошибки.

Не забудьте добавить трейт Laravel\Scout\Searchable.

namespace App\Models;

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

class Post extends Model
{
    use Searchable;

    public function scoutIndexMigration(): array
    {
        return [
            'fields' => [
                'id' => ['type' => 'bigint'],
                'name' => ['type' => 'text'],
                'category' => ['type' => 'string stored indexed'],
            ],
            'settings' => [
                'min_prefix_len' => '3',
                'min_infix_len' => '3',
                'expand_keywords' => '1',
            ],
        ];
    }

    // Какие данные сохранять и их модификация при необходимости
    public function toSearchableArray(): array
    {
        return [
            'id' => $this->id,
            'name' => $this->name,
            'category' => $this->category_id,
        ];
    }
}

Создание таблицы-индекса в manticore

Будут использованы настройки, определенные в scoutIndexMigration.

php artisan manticore:index "App\Models\Post"

Импорт (индексация) данных

После вышеуказанных действий, вызов методов save или create будет автоматически создавать, сохранять и удалять данные из таблицы-индекса мантикоры. Т.е. данные будут автоматически синхронизироваться между вашей базой данных и индексами поисковой системы manticore.

Если у вас уже есть какие-то данные в таблицах, их легко можно импортировать в мантикору.

php artisan scout:import "App\Models\Post"

Если данных нет, этот шаг выполнять необязательно.

Поиск

После выполненных действий уже можно производить поиск.

Post::search('Поисковый запрос')->get();

Помимо обычного поиска, драйвер так же предоставляет функции с реализацией нечеткого поиска, автодополнения, исправления орфографии, выделения слов из запроса и даже обратные запросы (Percolate queries). Подробности в github репозитории.

Если хочется чего-то большего, у вас специфические поисковые запросы или вы излишне беспокоитесь о производительности, всегда можно подключиться напрямую и делать что угодно. Саму библиотеку можно использовать только как индексатор.

Заключение

Не смотря на удивительно малую популярность manticore-scout-engine, этот драйвер для Laravel Scout реализует простую и удобную интеграцию Manticore с Laravel. Библиотека незаслуженно остаётся без внимания, что даже какое-то упоминание сложно найти. К тому же, официальную поддержку от разработчиков Laravel Scout вряд ли стоит ожидать в ближайшем будущем.

Всё перечисленное есть в документациях Manticore, Laravel и репозитории этого драйвера. Цель статьи только-лишь показать, что это всё уже возможно и эффективно работает без официальной поддержки от разработчиков Laravel Scout.

Комментарии (0)