[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 模型。

全文完。

链接

本帖已被设为精华帖!
本帖由系统于 7年前 自动加精
monkey
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 3

我承认,我喜欢这个功能

7年前 评论

“我们要真么做?” -> “我们要怎么做?” 已 fix :smile:

7年前 评论
monkey

@overtrue 感谢超哥 :rose::rose::rose:

7年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!