Простая интеграция поискового движка 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="LaravelScoutScoutServiceProvider"
php artisan vendor:publish --provider="RomanStrukManticoreScoutEngineManticoreServiceProvider"
В .env указываем нужный драйвер
SCOUT_DRIVER=manticore
Настройки модели
Для каждой таблицы базы данных будет своя таблица-индекс в мантикоре.
В модели, для которой необходим поиск, нужно определить поля, их типы и настройки таблиц-индексов для manticore.
Помимо этого, нужно определить toSearchableArray
, чтобы указать какие данные будут сохраняться в мантикору. Здесь же, при необходимости, можно модифицировать эти данные. Если этого не сделать, то scout будет пытаться сохранить все данные из таблицы, от этого могут возникать ошибки.
namespace AppModels;
use IlluminateDatabaseEloquentModel;
use LaravelScoutSearchable;
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 "AppModelsPost"
Импорт (индексация) данных
После вышеуказанных действий, вызов методов save
или create
будет автоматически создавать, сохранять и удалять данные из таблицы-индекса мантикоры. Т.е. данные будут автоматически синхронизироваться между вашей базой данных и индексами поисковой системы manticore.
Если у вас уже есть какие-то данные в таблицах, их легко можно импортировать в мантикору.
php artisan scout:import "AppModelsPost"
Если данных нет, этот шаг выполнять необязательно.
Поиск
После выполненных действий уже можно производить поиск.
Post::search('Поисковый запрос')->get();
Помимо обычного поиска, драйвер так же предоставляет функции с реализацией нечеткого поиска, автодополнения, исправления орфографии, выделения слов из запроса и даже обратные запросы (Percolate queries). Подробности в github репозитории.
Если хочется чего-то большего, у вас специфические поисковые запросы, всегда можно подключиться напрямую и делать что угодно.
Заключение
Не смотря на удивительно малую популярность manticore-scout-engine, этот драйвер для Laravel Scout реализует простую и удобную интеграцию Manticore с Laravel. Библиотека незаслуженно остаётся без внимания, что даже какое-то упоминание сложно найти. К тому же, официальную поддержку от разработчиков Laravel Scout вряд ли стоит ожидать в ближайшем будущем.
Всё перечисленное есть в документациях Manticore, Laravel и репозитории этого драйвера. Цель статьи только-лишь показать, что это всё уже возможно и эффективно работает без официальной поддержки от разработчиков Laravel Scout.
Автор: svm