Laravel 使用 Scout 实现全文检索
为何要采用全文检索
一个字块,可以秒级、毫秒级搜索出你搜索的内容
最原先我们可以简单的通过查询语句实现检索条件 比如:
代码语言:javascript复制select * from table where name like '%张三%';
再或者搜索更多字段
代码语言:javascript复制select * from table where title like '%php&' or content like '%laravel%' or ...
可想而知如果我们数据量很大,多达几十万、几百万数据查询一次是非常耗时的。即使你在数据库中添加了索引,还是不尽人意
因此需要一个更快、更快、更快的数据查询,而 Laravel 的 scout 就是专门为搜索来解决难题的
简介
Laravel Scout
为 Eloquent 模型 的全文搜索提供了基于驱动的简单的解决方案。通过使用模型观察者, Scout
会自动同步 Eloquent
记录的搜索索引。
目前, Scout
自带一个 Algolia
驱动。不过,编写自定义驱动也很简单,你可以轻松的通过自己的搜索实现来扩展 Scout
。
不过 是收费的,不过对于个人站来说已经处处有余了 (是对于我这种没有什么流量的人来说)
注册 Algolia
安装 Scout
代码语言:javascript复制composer require laravel/scout
发布配置文件
代码语言:javascript复制php artisan vendor:publish --provider="LaravelScoutScoutServiceProvider"
安装 Algolia
代码语言:javascript复制composer require algolia/algoliasearch-client-php
配置
编辑 .env 文件
代码语言:javascript复制SCOUT_DRIVER=algolia
SCOUT_QUEUE=true
ALGOLIA_APP_ID=CRTW*****
ALGOLIA_SECRET=a1a8a9e*****
其中 ALGOLIA_APP_ID
和 ALGOLIA_SECRET
在 刚才注册的 algolia 里,API Keys
目录中的 Application ID
就是 ALGOLIA_APP_ID
, Admin API Key
就是 ALGOLIA_SECRET
配置模型索引
代码语言:javascript复制<?php
namespace AppModels;
use LaravelScoutSearchable;
use IlluminateDatabaseEloquentModel;
class Post extends Model
{
use Searchable;
/**
* 获取模型的索引名称.
*
* @return string
*/
public function searchableAs()
{
return 'posts_index';
}
}
配置搜索数据
代码语言:javascript复制<?php
namespace AppModels;
use LaravelScoutSearchable;
use IlluminateDatabaseEloquentModel;
class Post extends Model
{
use Searchable;
/**
* 获取模型的索引名称.
*
* @return string
*/
public function searchableAs()
{
return 'posts_index';
}
/**
* 获取模型的索引数据数组
*
* @return array
*/
public function toSearchableArray()
{
$array = $this->toArray();
// 自定义数组...
return $array;
}
}
导入索引
代码语言:javascript复制php artisan scout:import "AppModelsPost"
搜索
代码语言:javascript复制$posts = Post::search('php')->get();
dd($posts)
如果你是在你本地计算器中进行尝试,你会发现,并没有什么卵用,根本搜索不到任何数据,接着进入 Algolia
后台,看下发现并没有记录,出现这种原因就是本地计算机不行(反正我是不行,),发布到自己的服务器然后在重新生成索引,应该就没问题了
如果你在
(adsbygoogle = window.adsbygoogle || []).push({});