[Laravel 5.3 新功能] 10. 全文搜索方案 Laravel Scout 介绍
说明#
此文章是 [Laravel 5.3 新功能] 系列的第十篇文章,全文搜索方案 Laravel Scout 介绍。
[Laravel 5.3 新功能] 系列完整文章列表请见:分享:[Laravel 5.3 新功能] 系列文章
注意事项#
Scout 代码还未发布,所以我只是根据 Taylor 在 Laracon 上的讲话来写下这篇文章。我会在其发布之后同步更新此文章内容。
Laravel Scout 介绍#
Scout 是一个 Eloquent 的全文搜索解决方案,它能非常便捷的给 Eloquent Model 添加索引并搜索出你想查询的内容。当前它得配合 Algolia 一起使用。
Scout 是一个独立的 Laravel 扩展包,类似 Cashier 一样,你需要通过 Composer 安装它。我们需要在 Model 里通过 traits 的方式引用它,引用后 Scout 将监听模型的状态并同步更新其搜索索引。接下来我们通过代码来看一下如何查找 Review
模型里含有 Llew
字符的数据。
Review::search('Llew')->get();
Review::search('Llew')->paginate(20);
Review::search('Llew')->where('account_id', 2)->get();
很简单易用,很优雅吧。
安装 Scout#
首先,我们运行以下命令安装 scout
composer require laravel/scout
接下来,在你的 config/app.php
文件里,将 Laravel\Scout\ScoutServiceProvider
添加到 providers
属性中。
最终你需要修改其配置文件 config/scout.php
,但是由于尚未发布,我还不知道应该如何配置此文件。
标记你的模型索引#
现在我们进入到上文提到的 Review
模型中,并引入 Laravel\Scout\Searchable
trait.
接下来我们将学习如何定义搜索模型的哪些字段,但是 Taylor 在 Laracon 没有完全说明其用法,所以我必须等到此扩展包正式发布后才能做详尽说明。在默认情况下,Scout 将给 toArray()
方法里的每个模型添加索引。
当我们完成这一步后,我们可以进入 Algolia 网站检查其是否配置成功。当你对 Review
模型进行添删改查时,你也能同步看到 Algolia 数据的变化。
搜索你的索引#
下面是搜索结果:
// Get all records from the Review that match the term "Llew"
Review::search('Llew')->get();
// Get all records from the Review that match the term "Llew",
// limited to 20 per page and reading the ?page query parameter,
// just like Eloquent pagination
Review::search('Llew')->paginate(20);
// Get all records from the Review that match the term "Llew"
// and have an account_id field set to 2
Review::search('Llew')->where('account_id', 2)->get();
这些结果将返回 Eloquent 模型的 collection 数据,这些模型数据的 ID 将存储在 Algolia,并且只返回符合搜索结果的 ID,然后 Scout 将根据这些 ID 进入你的数据中查出对应的数据。
你不需要复杂的 SQL 语句进行查询,只要简单的代码即可得到搜索结果。
队列#
你可能想到,当我们在更新模型数据时,都要通过 HTTP 请求 Algolia 的 API 接口,为了提高网站运行速度,你可能想把这部分请求放入队列。不过谢天谢地,这个配置过程非常简单。
进入你的 config/scout.php
文件,设置 queue
值为 true
,这就搞定了。
特殊情况#
我们现在来看一下特殊情况下的做法。
不带索引的操作#
当你想展示不带索引的搜索接口,你可以在使用 withoutSyncingToSearch()
方法:
Review::withoutSyncingToSearch(function () {
// make a bunch of reviews, e.g.
factory(Review::class, 10)->create();
});
通过 web 手动触发索引#
你已经准备好执行索引了,现在一些批量操作已经执行成功了,我们要怎么做?
你的 Eloquent 只要使用 searchable()
方法即可
Review::all()->searchable();
你也可以将此方法引用到范围查询中:
$user->reviews()->searchable();
你还可以设置其不添加任何索引:
Review::where('sucky', true)->unsearchable();
通过命令行触发索引#
php artisan scout:import App\\Review
调用上面的命令将自动索引 Review
模型。
全文完。
推荐文章: