学习如何使用 TNTSearch 驱动程序与 Laravel Scout
发布于 作者: Percy Mamedy
Laravel Scout 为您的 Eloquent 模型 提供了一个简单、基于驱动程序的解决方案,用于添加全文搜索功能。
开箱即用,Laravel 5.3 附带 Algolia 驱动程序。但是,我们可以轻松编写自定义驱动程序;TeamTnt 正是通过为 Laravel Scout 提供 TNTSearch 驱动程序 来实现这一点。
入门
首先,让我们安装一个新的 Laravel 5.3 副本,我使用的是 Laravel 安装程序,因此
laravel new scout-tntsearch
现在,让我们安装运行 Scout 和 TntSearch 所需的包。首先安装 Laravel Scout
composer require laravel/scout
然后,安装 TNTSearch 驱动程序
composer require teamtnt/laravel-scout-tntsearch-driver
接下来,我们将把 **ScoutServiceProvider** 和 **TNTSearchScoutServiceProvider** 添加到 **config/app.php** 中的 providers 数组中
'providers' => [ /* * Package Service Providers... */ Laravel\Scout\ScoutServiceProvider::class, TeamTNT\Scout\TNTSearchScoutServiceProvider::class,]
现在,让我们发布 Laravel Scout 配置文件
php artisan vendor:publish --provider="Laravel\Scout\ScoutServiceProvider"
一个新的配置文件 **scout.php** 应该在我们的配置目录中可用。让我们正确设置配置,以便 Scout 知道我们想要使用 TntSearch 驱动程序而不是 Algolia。
在我们的 **.env** 文件中,我们将添加以下内容
SCOUT_DRIVER=tntsearch
接下来,在 **config/scout.php** 中,我们将添加以下内容
'tntsearch' => [ 'storage' => storage_path(),],
这实际上指定了索引文件将存储的目录。
我们现在已经成功地使用 Laravel Scout 和 TNTSearch 驱动程序配置了我们的应用程序,并且可以开始搜索我们的 Eloquent 模型了。
创建数据库
我们的 App 数据库目前不包含任何数据,我们需要一个实际的数据库来测试我们的应用程序。因此,让我们从 MySQL 获取示例 Sakila film 数据库,它是一个示例数据库,旨在提供可用于示例的标准模式。然后将其导入到我们的应用程序数据库中。
现在,我们有一些数据可以测试 Laravel Scout 的一些功能。让我们为 film 表创建一个 Eloquent 模型。
php artisan make:model Models/Film
我们将在我们的模型上设置 **primaryKey** 和 **table** 属性,以便 Eloquent 知道为这些值使用什么。
现在,我们有了 film 表的 Eloquent 模型,让我们看看是否可以用它查询一些数据。
我们的 film 表包含 **1000** 条记录,因此是开始测试 Laravel Scout 和 TntSearch 功能的完美起点。
模型索引
从 Laravel 文档中,我们阅读到以下内容:“每个 Eloquent 模型都与给定的搜索“索引”同步,该索引包含该模型的所有可搜索记录。换句话说,您可以将每个索引视为一个 MySQL 表。默认情况下,每个模型将被持久化到与模型的典型“表”名称匹配的索引中。通常,这是模型名称的复数形式;但是,您可以通过覆盖模型上的 searchableAs
方法来自定义模型的索引:”
好的,所以首先我们将把 **Searchable** 特性添加到我们的模型中,然后我们将自定义要创建和保存的索引名称。此索引将用于执行搜索,而不是查询数据库,因此我们在执行搜索时会获得更高的速度。
索引
我们首先需要为第一次创建 **Index** 文件。
php artisan scout:import "App\Models\Film"
我们可以清楚地看到 Laravel Scout 如何将数据分块并将其一次导入索引 100 行,从而防止我们的脚本崩溃或超时。如果你问我,这真的很酷!。
现在,我们在存储目录中有一个 **films_index.index** 文件,Laravel Scout 将在对 Film 模型执行搜索时使用它。
现在你可能会问自己,当我更新 film 表时会发生什么,我是否需要再次导入数据并重新创建索引?不,Laravel Scout 已经在您更新模型时负责更新索引。即当您创建新记录、更新记录和删除记录时。
使用 TNT Search 搜索
我们现在可以使用 **Searchable** 特性提供的 **search** 方法搜索我们的模型。
App\Models\Film::search('ANGELS LIFE')->get();
我们获得了 3 个结果,所有结果的标题中都包含我们已指定给搜索方法的某些关键字。告别 WHERE LIKE %% 查询。
还要注意,在搜索期间将使用所有已索引的字段,因此包括描述、发行年份等等。
返回这些结果的速度简直令人惊叹,因此当您需要搜索大量数据时,它将真正提升您的应用程序性能。
最后的话
我真的很推荐使用 Laravel Scout 来查询大型数据库,这将是它最有用和强大的地方。确保您也查看了 Laravel Scout 官方文档,那里有一些非常酷的东西可以学习。
我还将此演示的代码发布到了 GitHub 上,您可以查看它以作参考。