waavi / laravel-scout-mysql-driver
Laravel Scout 的 MySQL 驱动。
Requires
- php: >=5.6.4
- laravel/framework: ~5.4
- laravel/scout: ^3.0
README
这是 damiantw/laravel-scout-mysql-driver 的一个版本,使用 MySQL 的 FULLTEXT 索引或 WHERE LIKE '%:search% 语句搜索 Eloquent 模型。
安装
注意:您计划使用此驱动程序搜索的任何模型都必须使用 MySQL MyISAM 或 InnoDB 表。
如果您还没有安装 Laravel Scout,请在项目中安装它并将 Laravel\Scout\Searchable 特性应用到您希望使其可搜索的任何 Eloquent 模型。
通过 Composer 安装此包
composer require damiantw/laravel-scout-mysql-driver
接下来,将 ServiceProvider 添加到 config/app.php 中的包服务提供商
/* * Package Service Providers... */ DamianTW\MySQLScout\Providers\MySQLScoutServiceProvider::class,
将默认配置追加到 config/scout.php
'mysql' => [ 'mode' => 'NATURAL_LANGUAGE', 'model_directories' => [app_path()], 'min_search_length' => 0, 'min_fulltext_search_length' => 4, 'min_fulltext_search_fallback' => 'LIKE', 'query_expansion' => false ]
在您的 .env 文件中设置 SCOUT_DRIVER=mysql
请注意,此 Laravel Scout 驱动程序不需要在模型更改时更新任何索引,因为这是由 MySQL 本地处理的。因此,您可以在 config/scout.php 中安全地禁用队列。
/* |-------------------------------------------------------------------------- | Queue Data Syncing |-------------------------------------------------------------------------- | | This option allows you to control if the operations that sync your data | with your search engines are queued. When this is set to "true" then | all automatic data syncing will get queued for better performance. | */ 'queue' => false,
此外,不需要使用 php artisan scout:import 命令。但是,如果您计划在 NATURAL_LANGUAGE 或 BOOLEAN 模式下使用此驱动程序,您应首先运行提供的 控制台命令 以创建所需的 FULLTEXT 索引。
用法
只需在您的 Searchable 模型上调用 search() 方法即可
$beers = App\Drink::search('beer')->get();
或者使用分页
$beers = App\Drink::search('beer')->paginate(15);
可以使用 where() 构建器方法应用简单的约束(每个额外的 WHERE 都将使用 AND 应用)。
$beers = App\Drink::search('beer')->where('in_stock', 1)->get();
以下运算符可以应用于 WHERE 语句:<> != = <= < >= >(如果未指定运算符,则将使用 =)
$beers = App\Drink::search('beer')->where('abv >', 10)->get();
有关更多信息,请参阅 Laravel Scout 文档。
模式
此驱动程序可以根据在 Laravel 配置值 scout.mysql.mode 中设置的模式的类型执行不同类型的搜索查询。目前支持 4 种不同的模式:NATURAL_LANGUAGE、BOOLEAN、LIKE 和 LIKE_EXPANDED。
NATURAL_LANGUAGE 和 BOOLEAN 模式
在 NATURAL_LANGUAGE 和 BOOLEAN 模式下,驱动程序将在相应的模式下运行 MySQL 的 WHERE MATCH() AGAINST() 查询。
两种模式下的搜索查询将包括模型的所有与 FULLTEXT 兼容的字段(从模型的 toSearchableArray() 方法返回的 CHAR、VARCHAR、TEXT)。这些字段需要具有 FULLTEXT 索引。您可以使用提供的 控制台命令 创建此索引。
例如,在一个具有以下数据库结构的 POST 模型上运行搜索
在 NATURAL_LANGUAGE 模式下会产生以下查询
select * from `posts` where MATCH(content,meta) AGAINST(:_search IN NATURAL LANGUAGE MODE)
在 BOOLEAN 模式下会产生以下查询
select * from `posts` where MATCH(content,meta) AGAINST(:_search IN BOOLEAN MODE)
BOOLEAN 模式下的运算符应作为搜索字符串的一部分传递。
有关更多信息,请参阅 MySQL 全文搜索函数文档。
LIKE 和 LIKE_EXPANDED 模式
LIKE 和 LIKE_EXPANDED 模式将运行 WHERE LIKE %:_search% 查询,该查询将包含模型从 toSearchableArray() 返回的所有字段。在 LIKE_EXPANDED 模式下,将使用搜索字符串中的每个单词分别查询每个字段。
例如,在具有以下数据库结构的 Customer 模型上运行搜索
给定搜索字符串 "John",在 LIKE 模式下会产生以下查询
SELECT * FROM `customers` WHERE (`id` LIKE '%John%' OR `first_name` LIKE '%John%' OR `last_name` LIKE '%JOHN%')
给定搜索字符串 "John Smith",在 LIKE_EXPANDED 模式下会产生以下查询
SELECT * FROM `customers` WHERE (`id` LIKE '%John%' OR `id` LIKE '%Smith%' OR `first_name` LIKE '%John%' OR `first_name` LIKE '%Smith%' OR `last_name` LIKE '%John%' OR `last_name` LIKE '%Smith%')
控制台命令
包含命令 php artisan scout:mysql-index {model?} 用于管理 FULLTEXT 索引,这些索引对于 NATURAL_LANGUAGE 和 BOOLEAN 模式是必需的。
如果省略了模型参数,则命令将运行具有 Laravel\Scout\Searchable 特性和 MySQL 连接的所有模型,目录由 Laravel 配置值 scout.mysql.model_directories 定义。
创建索引
将命令传递给一个模型,为模型的所有与 FULLTEXT 兼容的字段(CHAR、VARCHAR、TEXT)创建 FULLTEXT 索引,这些字段由模型的 toSearchableArray() 方法返回。索引名称将是模型 searchableAs() 方法的输出。
如果为模型已存在索引,并且模型包含不在现有索引中的新可搜索字段,则将删除并重新创建索引。
php artisan scout:mysql-index App\\Post
删除索引
传递 -D 或 --drop 选项以删除模型的现有索引。
php artisan scout:mysql-index App\\Post --drop
配置
可以通过修改 Laravel 配置值 scout.mysql 来更改行为。
-
scout.mysql.mode- 用来确定驱动程序如何运行搜索查询的 模式。可接受值为NATURAL_LANGUAGE、BOOLEAN、LIKE和LIKE_EXPANDED。 -
scout.mysql.model_directories- 如果未向包含的php artisan scout:mysql-index命令提供模型参数,则将搜索此处定义的目录以查找具有Laravel\Scout\Searchable特性和 MySQL 连接的模型。 -
scout.mysql.min_search_length- 如果搜索字符串的长度小于此值,则不会运行搜索查询,并返回空的 Collection。 -
scout.mysql.min_fulltext_search_length- 如果使用NATURAL_LANGUAGE或BOOLEAN模式,并且搜索字符串的长度小于此值,则驱动程序将回退到备用模式。默认情况下,MySQL 需要至少 4 个字符的搜索字符串长度才能运行FULLTEXT查询。有关更改此设置的信息,请参阅 MySQL 全文搜索微调文档。 -
scout.mysql.min_fulltext_search_fallback- 当搜索字符串的长度小于scout.mysql.min_fulltext_search_length时,在NATURAL_LANGUAGE或BOOLEAN模式下用作回退的LIKE模式。可接受值为LIKE和LIKE_EXPANDED。 -
scout.mysql.query_expansion- 如果设置为 true,则在搜索查询中使用 MySQL 查询扩展。仅适用于NATURAL_LANGUAGE模式。有关更多信息,请参阅 MySQL 全文搜索与查询扩展文档。