mahmoudnaguib/laravel-scout-mysql-driver

用于Laravel Scout的MySQL驱动。

1.0.0 2022-06-11 20:38 UTC

This package is not auto-updated.

Last update: 2024-09-30 05:30:58 UTC


README

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

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

安装

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

如果您还没有安装Laravel Scout,请将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()查询。

这两种模式的搜索查询将包括模型从toSearchableArray()方法返回的所有与FULLTEXT兼容的字段(CHARVARCHARTEXT)。对于这些字段,需要有一个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模式

LIKELIKE_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_LANGUAGEBOOLEAN 模式是必需的。

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

创建索引

将命令传递一个 Model,以创建一个针对 Model 的所有 FULLTEXT 兼容字段(CHARVARCHARTEXT)的 FULLTEXT 索引,这些字段来自 Model 的 toSearchableArray() 方法。索引名称将是 Model 的 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 连接的 Model。

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

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

  • scout.mysql.min_fulltext_search_fallback - 当搜索字符串的长度小于 scout.mysql.min_fulltext_search_length 时,在 NATURAL_LANGUAGEBOOLEAN 模式下用作回退的模式。可接受值是 LIKELIKE_EXPANDED

  • scout.mysql.query_expansion - 如果设置为 true,MySQL 查询扩展将在搜索查询中使用。仅适用于 NATURAL_LANGUAGE 模式。有关更多信息,请参阅MySQL Full-Text Searches with Query Expansion 文档