Этот пакет предоставляет универсальный драйвер скаута Laravel, который выполняет полнотекстовый поиск по данным индексированной модели, используя базу данных SQL в качестве бэкэнда хранения. Индексированные данные хранятся в нормализованной форме, позволяя эффективно и нечеткий поиск, который не требует полного и/или точного совпадения.
Этот драйвер является альтернативой teamtnt/laravel-scout-tntsearch-driver . Основное отличие состоит в том, что этот драйвер предоставляет меньше функций (например, поиск GEO). Вместо этого он работает со всеми системами баз данных, поддерживаемых самим Ларавелом (которые в основном являются всеми драйверами PDO). Кроме того, алгоритм поиска немного отличается.
Все тесты выполняются через действия GitHub для PHP 8.0, 8.1 и 8.2 в следующих системах базы данных:
Фактические ограничения в отношении поддерживаемых систем баз данных в основном связаны с использованием общего выражения таблицы с использованием Staudenmeir/Laravel-CTE. Пожалуйста, убедитесь, что ваша система базы данных поддерживается перед использованием пакета, или вы можете столкнуться с ошибками базы данных.
Вы можете установить пакет через композитор:
composer require namoshek/laravel-scout-databaseПосле установки пакета необходимо опубликовать файл конфигурации, а также миграции:
php artisan vendor:publish --provider= " NamoshekScoutDatabaseScoutDatabaseServiceProvider " --tag= " config "
php artisan vendor:publish --provider= " NamoshekScoutDatabaseScoutDatabaseServiceProvider " --tag= " migrations " Если вы хотите использовать другой префикс таблицы, чем scout_ для таблиц, созданных этим пакетом, вы должны изменить конфигурацию, а также соответствующие скопированные миграции. Когда вы это сделаете, вы можете применить миграции базы данных:
php artisan migratev0.x до v1.x С новой версией схема базы данных изменилась, и новые миграции должны быть опубликованы с использованием:
php artisan vendor:publish --provider= " NamoshekScoutDatabaseScoutDatabaseServiceProvider " --tag= " migrations "Тот же намек, который упоминался выше в разделе установки , также применяется и к недавно опубликованным миграциям.
Конфигурация была немного уменьшена, и вы можете сравнить новый файл конфигурации со старым, чтобы удалить устаревшие настройки. Однако пропуск этой части не оказывает негативного влияния на производительность скаутского драйвера.
Команда NamoshekScoutDatabaseCommandsCleanWordsTable::class была удалена, и вы должны не подсредствовать ее, если вы добавили ее ранее.
Большинство случаев protected полей и методов были изменены на private , чтобы упростить разработку в отношении изменений преодоленного совместимости в будущем. Если вы не были активно переопределяют части реализации, это вообще не влияет на вас.
Чтобы указать Scout использовать драйвер, предоставленный этим пакетом, вам необходимо изменить опцию driver в config/scout.php на database . Если вы не изменили файл конфигурации скаутов, вы также можете вместо этого установить переменную среды SCOUT_DRIVER в database .
Все доступные параметры конфигурации самого пакета можно найти в config/scout-database.php . Параметры подробно описаны в самом файле. По умолчанию в пакете используется UnicodeTokenizer и PorterStemmer , который подходит для английского языка. Поиск добавляет зацепленный подстановочный знак к последнему токену, и не все термины поиска должны быть найдены, чтобы документ был отображаться в результатах (хотя должно быть хотя бы одно совпадение).
Вы также можете добавить подстановочный знак в каждый токен поиска, включив wildcard_all_tokens в файле конфигурации, это не рекомендуется по соображениям производительности.
Основная установка, скорее всего, не требует, чтобы вы изменили какую -либо из этих настроек. Просто чтобы убедиться, что вы должны взглянуть на опцию connection . Если вы хотите изменить это, сделайте это, прежде чем запустить миграции, или таблицы будут созданы с использованием неправильного подключения к базе данных.
В настоящее время доступен только UnicodeTokenizer . Он будет разделять строки на любом символе, который не является ни буквой, ни числом в соответствии с шаблонами p{L} и p{N} . Это означает, что точки, колоны, тире, пробелы и т. Д. - это разделенные критерии.
Если у вас есть разные требования к токенизатору, вы можете предоставить свою собственную реализацию через конфигурацию. Просто убедитесь, что он реализует интерфейс Tokenizer .
В настоящее время доступны все стебля, реализованные пакетом wamania/php-stemmer . Для каждого из них добавлен класс обертки:
DanishStemmerDutchStemmerEnglishStemmerFrenchStemmerGermanStemmerItalianStemmerNorwegianStemmerNullStemmer (можно использовать для отключения Stemming)PorterStemmer (по умолчанию, так же, как и EnglishStemmer )PortugueseStemmerRomanianStemmerRussianStemmerSpanishStemmerSwedishStemmer Если у вас есть разные требования к стволу, вы можете предоставить свою собственную реализацию через конфигурацию. Просто убедитесь, что он реализует интерфейс Stemmer .
Пакет последовал за доступными вариантами использования, описанными в официальной документации по скаутам. Пожалуйста, имейте в виду перечисленные ограничения, хотя.
Драйвер поиска внутри использует одну таблицу, которая содержит термины и ассоциацию с документами. При индексации документов (то есть добавления или обновления моделей в индексе поиска) двигатель будет использовать настроенный токенизатор для разделения ввода каждого столбца на токены. Токенизатор, настроенный по умолчанию, просто разбивает входы в слова, состоящие из любой буквы или числа Unicode, что означает любой другой символ , подобный , . , - , _ ! , ? , / , пробел и все другие особые символы считаются разделителями для токенов и будут удалены токенизатором. Таким образом, такие символы никогда не окажутся в самом индексе поиска.
После того, как входные данные были токенизированы, каждый токен (и на данный момент мы фактически ожидаем, что наши токены будут словами) проходят через настроенный ствол, чтобы получить стебель (то есть корневое слово ). Выполнение этого действия позволяет нам искать подобные слова позже. Например, PorterStemmer будет производить intellig как вывод как для intelligent , так и для intelligence в качестве входных данных. Как это помогает при поиске, будет ясно через мгновение.
Наконец, результаты этого процесса хранятся в базе данных. Индексная таблица заполнена результатами процесса Stemming и ассоциациями с индексированными моделями (тип модели и идентификатор). Кроме того, для каждой строки в индексе база данных также содержит количество событий в документе. Мы используем эту информацию для оценки в поисковой части нашего двигателя.
При выполнении поискового запроса, тот же процесс токенизации и вытекания, который используется для индексации, применяется к строке поискового запроса. Результатом этого процесса является список стеблей (или корневых слов ), которые затем используются для выполнения фактического поиска. В зависимости от конфигурации пакета, поиск вернет документы, которые содержат хотя бы один или все стебли. Это делается путем вычисления оценки для каждого совпадения в индексе на основе обратной частоты документов (то есть соотношение между индексированными документами и документами, содержащими одно из поисковых слов), частота термина (то есть количество вхождений поискового термина в документе) и отклонений термина (которая соответствует только для поиска Wildcard). Возвращенные документы, упорядоченные по их счету в порядке убывания, пока не будет достигнут желаемый предел.
Можно расширить таблицу индекса поиска ( scout_index ) на пользовательские столбцы. Во время индексации эти столбцы могут быть заполнены пользовательским контентом, и во время поиска поиски могут быть охвачены этими столбцами (точное совпадение). Эта функция особенно полезна при работе с многопользовательским приложением, где индекс поиска используется несколькими арендаторами.
В нашем примере мы добавляем обязательный столбец tenant_id в индекс поиска.
return new class extends Migration {
public function up (): void
{
Schema :: table ( ' scout_index ' , function ( Blueprint $ table ) {
$ table -> uuid ( ' tenant_id ' );
});
}
public function down (): void
{
Schema :: table ( ' scout_index ' , function ( Blueprint $ table ) {
$ table -> dropColumn ([ ' tenant_id ' ]);
});
}
}; tenant_id добавляется во время индексации для каждой модели:
class User extends Model
{
public function toSearchableArray (): array
{
return [
' id ' => $ this -> id ,
' name ' => $ this -> name ,
' tenant_id ' => new StandaloneField ( $ this -> tenant_id ),
];
}
} tenant_id отфильтровывается во время поиска на основе $tenantId , который может быть взят из HTTP -запроса:
User :: search ( ' Max Mustermann ' )
-> where ( ' tenant_id ' , $ tenantId )
-> get ();Очевидно, что этот пакет не предоставляет поисковую систему, которая (даже удаленно) приносит производительность и качество профессиональной поисковой системы, такой как предложения Elasticsearch. Это решение предназначено для проектов меньшего до среднего размера, которые нуждаются в довольно простом в режиме решения.
Также стоит отметить, что в настоящее время не реализованы следующие функции скаутов:
User::search('Mustermann')->within('users_without_admins')User::search('Musterfrau')->orderBy('age', 'desc')Одна из проблем с этой поисковой системой заключается в том, что она может привести к проблемам, если несколько работников в очередь работают над индексацией одного документа одновременно (база данных будет тупиться). Чтобы обойти эту проблему, количество попыток, используемых для транзакций, настраивается. По умолчанию каждая транзакция пробует максимум три раза, если происходит тупик (или любая другая ошибка).
Лицензия MIT (MIT). Пожалуйста, смотрите файл лицензии для получения дополнительной информации.