yab/laravel-scout-mysql-driver

该包已被废弃且不再维护。未建议任何替代包。

用于 Laravel Scout 的 MySQL 驱动。

v5.1.0 2021-12-08 05:53 UTC

README

使用 MySQL FULLTEXT 索引或 WHERE LIKE '%:search% 语句来搜索 Eloquent 模型。

  1. 安装
  2. 用法
  3. 模式
  4. 控制台命令
  5. 配置

安装

注意:任何计划使用此驱动进行搜索的模型都必须使用 MySQL MyISAM 或 InnoDB 表。

如果您还没有,您应该将 Laravel Scout 安装到您的项目中 并将 Laravel\Scout\Searchable 特性应用到您希望使其可搜索的任何 Eloquent 模型上。

通过 Composer 安装此包

composer require yab/laravel-scout-mysql-driver

接下来,如果您使用的是 Laravel 版本 5.4,请将以下 ServiceProvider 添加到 config/app.php 中的 Providers 数组

        /*
         * 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_LANGUAGEBOOLEAN 模式下使用此驱动,您应该首先运行提供的 控制台命令 以创建所需的 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_LANGUAGEBOOLEANLIKELIKE_EXPANDED

NATURAL_LANGUAGE 和 BOOLEAN 模式

NATURAL_LANGUAGEBOOLEAN 模式下,驱动程序将在相应模式下运行 MySQL WHERE MATCH() AGAINST() 查询。

两种模式的搜索查询将包括模型中所有与FULLTEXT兼容的字段(CHARVARCHARTEXT),这些字段由模型的toSearchableArray()方法返回。这些字段需要FULLTEXT索引。您可以使用提供的控制台命令创建此索引。

例如,对一个具有以下数据库结构的POST模型进行搜索

列名 类型
id int(10) UN AI PK
content VARCHAR(255)
meta TEXT

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模式

LIKELIKE_EXPANDED模式将运行WHERE LIKE %?%查询,这将包括模型中由toSearchableArray()返回的所有字段。LIKE_EXPANDED模式将使用搜索字符串中的每个单独的词对每个字段进行查询。

例如,对一个具有以下数据库结构的Customer模型进行搜索

列名 类型
id int(10) UN AI PK
first_name VARCHAR(255)
last_name VARCHAR(255)

给定搜索字符串"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?}包括用于管理NATURAL_LANGUAGEBOOLEAN模式所需的FULLTEXT索引。

如果省略了模型参数,则命令将在Laravel\Scout\Searchable特性和MySQL连接定义的目录中运行所有具有Laravel\Scout\Searchable特性和MySQL连接的模型。

创建索引

传递一个模型给命令以创建所有与模型中FULLTEXT兼容的字段(CHARVARCHARTEXT)的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_LANGUAGEBOOLEANLIKELIKE_EXPANDED

  • scout.mysql.model_directories - 如果未向包含的php artisan scout:mysql-index命令提供模型参数,则将搜索此处定义的目录以查找具有Laravel\Scout\Searchable特性和MySQL连接的模型。

  • scout.mysql.min_search_length - 如果搜索字符串的长度小于此值,则不会运行搜索查询,并返回空集合。

  • scout.mysql.min_fulltext_search_length - 如果使用 NATURAL_LANGUAGEBOOLEAN 模式,并且搜索字符串的长度小于此值时,驱动程序将回退到备用模式。默认情况下,MySQL 需要至少 4 个字符的搜索字符串长度才能运行 FULLTEXT 查询。有关更改此设置的详细信息,请参阅MySQL 全文搜索优化的文档

  • scout.mysql.min_fulltext_search_fallback - 当在 NATURAL_LANGUAGEBOOLEAN 模式中搜索字符串的长度小于 scout.mysql.min_fulltext_search_length 时将使用的备用模式。可接受的值是 LIKELIKE_EXPANDED

  • scout.mysql.query_expansion - 如果设置为 true,则 MySQL 查询扩展将在搜索查询中使用。仅适用于使用 NATURAL_LANGUAGE 模式的情况。有关更多信息,请参阅MySQL 全文搜索与查询扩展的文档