情景前提
普通的sql where like 搜索的形式,不能满足于内容网站的搜索,需求要有分词功能,以便能更准确的找到需要展示的内容。
TNTSearch是一个php实现的轻量级全文索引引擎,可以满足一般网站的使用。
安装
composer reuquire vanry/laravel-scout-tntsearch
发布scout配置文件
php artisan vendor:publish --provider="Laravel\Scout\ScoutServiceProvider"
发布tntsearch配置文件
php artisan vendor:publish --provider="Vanry\Scout\TNTSearchScoutServiceProvider"
启用
在.env
文件中添加
SCOUNT_DRIVER=tntsearch
安装中文分词包(可选)
SCWS
composer require vany/scws
jieba
composer require fukuball/jieba-php
phpanalysis
composer require lmz/phpanalysis
3选1,或不安装,将使用tntsearch默认的分词功能, 其中scws由C语言写,性能最佳,但不支持windows。jieba分词效果最好,但性能较差,占用内存大。phpanalysis介于两者之间。
在.env
中配置分词器
TNTSEARCH_TOKENIZER=phpanalysis
用法
1.添加Searchable Trait
到模型
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Laravel\Scout\Searchable;
class Post extends Model
{
use Searchable;
/**
* Get the indexable data array for the model.
*
* @return array
*/
public function toSearchableArray()
{
$array = $this->toArray();
// Customize array...
return $array;
}
}
2.同步数据到搜索索引
# scout 命令
php artisan scout:import App\Models\Post
# tntsearch 命令, 性能更好
php artisan tntsearch:import App\Models\Post
3.使用模型进行搜索
Post::search('关键词')->get();
//除了搜索用search方法之外,其余的跟之前用like没区别,可以分页
Post::search('关键词')->paginate(10);