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

全文完。

链接

本帖已被设为精华帖!
本帖由系统于 2年前 自动加精
monkey
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 3

我承认,我喜欢这个功能

2年前 评论

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

2年前 评论
monkey

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

2年前 评论

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!

社区文档:

将托管在 packagist.org 和 github.com 的扩展包使用国内 CDN 加速
GitHub Laravel 扩展包 TOP 250
速查表方便快速查询框架功能,支持手机访问,支持中英文版本
Laravel 中文文档,由社区用户翻译和维护,将会保持一直更新
此文档的目的,就是为了提高技术团队的凝聚力、一致性和生产效率。
开发环境的部署,开发者工具的选择,适用于 Mac 和 Windows。
浓缩过后的精华
Laravel Nova 后台管理面板文档的中文翻译
Lumen 中文文档,由社区用户翻译和维护,将会保持一直更新
Laravel 下知名扩展包 Dingo API 的中文文档,Laravel API 开发必知必会