引言
对于数据库查询,主键和索引每每是加速搜索的利器。而对于文本搜索,模糊搜索,全文检索,MySQL的MyISAM引擎虽然支持,可是性能每每不能达到生产的需求,或者说服务带载能力太弱。php
咱们须要专门的文本搜索引擎,而且链接到laravel应用程序内,这就是本文所要说的Scout。laravel
代码时间
laravel scout 是一个独立的包和类库,能够很方便地经过composer接入系统,且与Eloquent Model模型关联使用。git
官方scout内置了 Algolia 和 Elasticsearch 驱动,可是社区也提供了其余可选项。若是默认的话,优先选用的确定是 Algolia。程序员
laravel 5.3及以上版本为系统引入scout库:web
composer require laravel/scout
而后在 config/app.php 文件内的 providers 服务提供者内加入以下内容:数据库
'providers' => [
Laravel\Scout\ScoutServiceProvider::class,
]
若是想要使用配置文件设置scout,那么就把配置文件发布出来:编程
php artisan vendor:publish
这会生成 config/scout.php 文件。咱们再引入 algolia 的sdk库文件,以便在程序内使用:bash
composer require algolia/algoliasearch-client-php
想要在模型内引入搜索服务,只需在模型文件内引入微信
use Laravel\Scout\Searchable;
在模型内手动实现,那些属性和字段能够被搜索,只需实现 toSearchableArray() 方法。而后实现 searchableAs(),返回一个字符串,用于指定索引的模型名。并发
scout默认订阅了模型的 create/delete/update 时间,这些写操做的数据会触发更新索引,删除索引,建立索引。方式能够是同步,也能够放到队列内异步处理。
经过索引进行搜索,scout在查询方式上几乎与eloquent model的方式别无二致。好比:
Review::search('Lious')->get();
或者链式调用分页:
Review::search('Lious')->paginate(20);
因为 search 方法返回的是Query Builder对象,能够链式调用查询条件,和集合的方法。好比对查询结果集进行过滤:
Review::search('Lious')->where('account_id', 2)->get();
你在模型内使用的方法,这里都适用。
对于某些数据有可能并不想创建索引,放入搜索引擎,那么只需在模型内显式声明以下:
Review::withoutSyncingToSearch(function () {
factory(Review::class, 10)->create();
});
批量建立10条数据,且不创建索引。
手动控制某些输入放入搜索引擎,创建索引数据,则能够链式调用 searchable() 方法:
Review::all()->searchable();
或者经过关联关系,将关联模型的数据写入搜索引擎:
$user->reviews()->searchable();
某些搜索数据不进行索引:
Review::where('actived', false)->unsearchable();
无效的条目不加入索引,节省空间。
假如你的数据库已经生产了大量的数据,或者在测试阶段,想要手动把全部的定义数据导入到搜索引擎,能够在命令行如此操做:
php artisan scout:import App\\Review
写在最后
本文经过介绍laravel scout索引类的方法,向你们展现了如何引入搜索引擎,以及在程序内精细化控制索引数据的方法。全文检索在现代的web应用中应对高并发的场景颇有一套,值得你们深刻研究学习。
Happy coding :-)
我是@程序员小助手,持续分享编程知识,欢迎关注。
本文分享自微信公众号 - 程序员小助手(mql45ea)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。