aleex1848 / laravel-scout-mysql-driver
MySQL 驱动程序,用于 Laravel Scout。
Requires
- php: ^7.2|^8.0
- laravel/scout: ~6.0|~7.0|~8.0|~9.0|~10.0
Requires (Dev)
- laravel/framework: 5.6.* || 5.7.* || 5.8.* || ^6.0 || ^7.0 || ^8.0
- mockery/mockery: ^1.3
- phpunit/phpunit: 8.5.x-dev
This package is auto-updated.
Last update: 2024-09-26 18:13:59 UTC
README
使用 MySQL FULLTEXT
索引或 WHERE LIKE '%:search%
语句来搜索 Eloquent 模型。
安装
注意:任何计划使用此驱动程序进行搜索的模型都必须使用 MySQL MyISAM 或 InnoDB 表。
如果您尚未安装,请将 Laravel Scout 安装到您的项目中并将 Laravel\Scout\Searchable
特性应用于您希望可搜索的任何 Eloquent 模型。
通过 Composer 安装此包
composer require yab/laravel-scout-mysql-driver
如果使用的是 Laravel 版本 5.4,请在 config/app.php
中的 Providers 数组中包含以下 ServiceProvider
/* * Package Service Providers... */ Yab\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 文档。
模式
此驱动程序可以执行不同类型的搜索查询,具体取决于 scout.mysql.mode
Laravel 配置值中设置的模式。目前支持 4 种不同的模式:NATURAL_LANGUAGE
、BOOLEAN
、LIKE
和 LIKE_EXPANDED
。
NATURAL_LANGUAGE 和 BOOLEAN 模式
在 NATURAL_LANGUAGE
和 BOOLEAN
模式下,驱动程序将分别运行 MySQL 的 WHERE MATCH() AGAINST()
查询。
这两种模式下的搜索查询将包括模型中所有与 FULLTEXT
兼容的字段(CHAR
、VARCHAR
、TEXT
),这些字段来自模型的 toSearchableArray()
方法。对于这些字段,必须有一个 FULLTEXT
索引。您可以使用提供的 控制台命令 创建此索引。
例如,对一个具有以下数据库结构的 POST
模型进行搜索
在 NATURAL_LANGUAGE
模式下会产生以下查询
select * from `posts` where MATCH(content,meta) AGAINST(? IN NATURAL LANGUAGE MODE)
在 BOOLEAN
模式下会产生以下查询
select * from `posts` where MATCH(content,meta) AGAINST(? IN BOOLEAN MODE)
BOOLEAN
模式下的运算符应作为搜索字符串的一部分传递。
有关更多信息,请参阅MySQL 全文搜索函数文档。
LIKE 和 LIKE_EXPANDED 模式
LIKE
和 LIKE_EXPANDED
模式将执行 WHERE LIKE %?%
查询,包括从 toSearchableArray()
返回的 Model 的所有字段。LIKE_EXPANDED
模式将使用搜索字符串中的每个单词单独查询每个字段。
例如,对一个具有以下数据库结构的 Customer
模型进行搜索
将生成以下 LIKE
模式下的查询,给定搜索字符串 "John"
SELECT * FROM `customers` WHERE (`id` LIKE '%John%' OR `first_name` LIKE '%John%' OR `last_name` LIKE '%JOHN%')
以及以下 LIKE_EXPANDED
模式下的查询,给定搜索字符串 "John Smith"
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 连接的 Model 运行,这些 Model 位于 scout.mysql.model_directories
Laravel 配置值定义的目录中。
创建索引
传递一个 Model 给命令,为 Model 的所有与 FULLTEXT
兼容的字段(CHAR
、VARCHAR
、TEXT
)创建 FULLTEXT
索引,这些字段由 Model 的 toSearchableArray()
方法返回。索引名称将是 Model 的 searchableAs()
方法的结果。
如果模型已存在索引,并且 Model 包含新的可搜索字段不在现有索引中,则将删除并重新创建索引。
php artisan scout:mysql-index App\\Post
删除索引
传递 -D
或 --drop
选项来删除 Model 的现有索引。
php artisan scout:mysql-index App\\Post --drop
配置
可以通过修改 scout.mysql
Laravel 配置值来更改行为。
-
scout.mysql.mode
- 用于确定驱动程序如何运行搜索查询的 模式。可接受的值是NATURAL_LANGUAGE
、BOOLEAN
、LIKE
和LIKE_EXPANDED
。 -
scout.mysql.model_directories
- 如果未向包含的php artisan scout:mysql-index
命令提供模型参数,则将搜索此处定义的目录以查找具有Laravel\Scout\Searchable
特性和 MySQL 连接的 Model。 -
scout.mysql.min_search_length
- 如果搜索字符串的长度小于此值,则不会运行搜索查询,并将返回一个空 Collection。 -
scout.mysql.min_fulltext_search_length
- 如果使用NATURAL_LANGUAGE
或BOOLEAN
模式,并且搜索字符串的长度小于此值,则驱动程序将回退到备用模式。默认情况下,MySQL 要求搜索字符串长度至少为 4 才能运行FULLTEXT
查询。有关更改此设置的信息,请参阅 MySQL Fine-Tuning MySQL Full-Text Search 文档。 -
scout.mysql.min_fulltext_search_fallback
- 当搜索字符串的长度小于scout.mysql.min_fulltext_search_length
时,在NATURAL_LANGUAGE
或BOOLEAN
模式下用作回退的LIKE
和LIKE_EXPANDED
模式。可接受的值是LIKE
和LIKE_EXPANDED
。 -
scout.mysql.query_expansion
- 如果设置为 true,则将在搜索查询中使用 MySQL 查询扩展。仅适用于NATURAL_LANGUAGE
模式。有关更多信息,请参阅 MySQL Full-Text Searches with Query Expansion 文档。