Manticore + Laravel + Scout

в 13:05, , рубрики: laravel, Manticore, scout

Простая интеграция поискового движка 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

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js