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

全文完。

链接#

本帖已被设为精华帖!
本帖由系统于 8年前 自动加精
monkey
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
讨论数量: 3

我承认,我喜欢这个功能

8年前 评论

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

8年前 评论
monkey

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

8年前 评论