Laravel 使用 Scout 实现全文检索

2019-12-17 21:41:33 浏览数 (1)

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_IDALGOLIA_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({});

0 人点赞