首页 >> PHP >> 内容页

Laravel用TNTSearch做内容搜索

情景前提

普通的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);