该软件包提供了一个通用的Laravel Scout驱动程序,该驱动程序使用SQL数据库作为存储后端对索引模型数据进行全文搜索。索引数据以归一化形式存储,允许不需要完整和/或精确匹配的高效且模糊的搜索。
该驱动程序是teamtnt/laravel-scout-tntsearch-driver的替代方案。主要区别在于,该驱动程序提供的功能较少(例如GEO搜索)。取而代之的是,它与Laravel本身支持的所有数据库系统(基本上都是PDO驱动程序)一起使用。同样,搜索算法略有不同。
所有测试均通过以下数据库系统的PHP 8.0、8.1和8.2的GitHub操作进行:
有关支持数据库系统的实际限制主要与使用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使用此软件包提供的驱动程序,您需要将config/scout.php中的driver选项更改为database 。如果您没有更改Scout配置文件,则还可以将SCOUT_DRIVER环境变量设置为database 。
软件包本身的所有可用配置选项都可以在config/scout-database.php中找到。这些选项在文件本身中彻底描述。默认情况下,该软件包使用适合英语的UnicodeTokenizer和PorterStemmer 。该搜索在最后一个令牌中添加了一个尾随的通配符,并不需要找到所有搜索词才能在结果中显示文档(虽然必须至少有一个匹配项)。
您也可以通过在配置文件中启用wildcard_all_tokens在每个搜索令牌中添加通配符,这不建议出于性能原因。
基本的安装很可能不需要您更改这些设置中的任何一个。只是为了确保您应该查看connection选项。如果要更改此操作,请在运行迁移之前,或使用错误的数据库连接创建表。
目前,只有一个UnicodeTokenizer 。它将既不是字母的字符,也不是根据p{L}和p{N} Regex模式的数字拆分字符串。这意味着点,结肠,破折号,空格等是分裂标准。
如果您对令牌仪有不同的要求,则可以通过配置提供自己的实现。只需确保它实现Tokenizer界面即可。
当前,所有由wamania/php-stemmer软件包实施的Stemmers都可以使用。每个人都添加了包装班:
DanishStemmerDutchStemmerEnglishStemmerFrenchStemmerGermanStemmerItalianStemmerNorwegianStemmerNullStemmer (可用于禁用词干)PorterStemmer (默认,与EnglishStemmer相同)PortugueseStemmerRomanianStemmerRussianStemmerSpanishStemmerSwedishStemmer如果您对Stemmer有不同的要求,则可以通过配置提供自己的实现。只需确保它实现Stemmer接口即可。
该软件包遵循官方侦察文档中描述的可用用例。但是请注意列出的限制。
搜索驱动程序在内部使用一个表,其中包含术语和与文档的关联。索引文档(即在搜索索引中添加或更新模型)时,引擎将使用配置的令牌器将每列的输入分为令牌。默认情况下配置的代币器简单地将输入分为由任何Unicode字母或数字组成的单词,这意味着任何其他字符,例如, . , - , _ ! , ? , / ,Whitespace和所有其他特殊字符被视为令牌的分离器,将由令牌删除。这样,这些字符永远不会最终进入搜索索引本身。
输入已被令牌化后,每个令牌(在这一点上,我们实际上希望我们的令牌是单词)都通过配置的词干来检索词干(即root Word )。执行此操作使我们以后可以搜索类似的单词。例如, PorterStemmer将产生intellig和intelligent作为输入的intelligence 。稍后清楚搜索时,这将如何有所帮助。
最后,此过程的结果存储在数据库中。索引表中填充了茎过程的结果以及与索引模型(模型类型和标识符)的关联。最重要的是,对于索引中的每一行,数据库还包含文档中的事件数。我们使用此信息在引擎的搜索部分进行评分。
执行搜索查询时,将与索引所用的相同的标记化和茎过程应用于搜索查询字符串。此过程的结果是词干(或根单词)的列表,然后将其用于执行实际搜索。根据软件包的配置,搜索将返回至少包含一个或全部词干的文档。这是通过基于反向文档频率计算索引中每场匹配的分数(即索引文档和包含一个搜索单词之一的文档之间的比率),术语频率(即文档中搜索术语中的出现)和术语偏差(仅与通配符搜索相关)。返回的是按照其降序订单订购的文件,直到达到所需的限制为止。
可以使用自定义列扩展搜索索引表( 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')该搜索引擎的一个问题是,如果多个队列工人同时处理单个文档的索引(数据库将死去),则可能导致问题。为了避免此问题,可以配置用于交易的尝试数量。默认情况下,如果发生僵局(或任何其他错误),则每次交易最多尝试三次。
麻省理工学院许可证(麻省理工学院)。请参阅许可证文件以获取更多信息。