根據 Laravel 官方文件Laravel 台灣翻譯文件 | Laravel 道場 介紹,Laravel Scout 套件預設使用 Algolia Driver ,但也可以使用其它 Driver,例如:ElasticSearch、MySQL或者磁碟資料方式。

Algolia 建立一個帳號

Algolia 免費提供 10,000 SEARCH REQUESTS/MONTH,對於測試的開發,相當足夠,另外還對新建立的帳號,提供 14 天最高等級的免費使用。註冊完成後會取得 Application ID 及 Admin API Key。

安裝 Laravel Scout 及 Algolia

# 安裝
composer require laravel/scout
# 產生設定檔
php artisan vendor:publish --provider="Laravel\Scout\ScoutServiceProvider"
# 安裝 Algolia 驅動 Driver
composer require algolia/algoliasearch-client-php

修改 .env

# Laravel Scout
SCOUT_DRIVER=algolia
# 如果需要使用隊列改為true並設定jobs
SCOUT_QUEUE=false
ALGOLIA_APP_ID=
取得的Application ID
ALGOLIA_SECRET=取得的Admin API Key

將 Laravel\Scout\Searchable trait 新增到你想要進行的搜尋模型中。

這邊我使用台北市公園資料來當作範例:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

//直接使用記錄功能
use Spatie\Activitylog\Traits\LogsActivity;

//使用 Scout 做搜尋
use Laravel\Scout\Searchable;
class Park extends Model
{
    use LogsActivity;
    use Searchable;

    //可新增編輯的欄位名稱
    protected $fillable = [
        'name', 'engname', 'overview', 'lat', 'lon',
        'dist', 'location', 'type', 'area', 'unit',
        'onlinedate', 'offlinedate', 'isshow', 'istop', 'sort'
    ];

    // //要記錄的欄位 ['*'] 全部
    protected static $logAttributes = ['*'];
    // //若使用 $logAttributes = ['*'] 時可使用來忽略某些欄位異動不啟用紀錄
    // // protected static $logAttributesToIgnore = [ 'type'];

    // //只記錄有改變的欄位
    // protected static $logOnlyDirty = true;

    // //無異動資料則不增加空資料,若沒設定 $ogOnlyDirty = true 時使用
    // protected static $submitEmptyLogs = false;

    // //log_name 欄位資料
    protected static $logName = '公園資料';

    /**
     * 取得模型的索引名稱。
     *
     * @return string
     */
    public function searchableAs()
    {
        return 'parks_index';
    }
}

將現有資料送入 Algolia

php artisan scout:import "App\Park"

到 Algolia 帳號中可以看到,資料已經被推送進來。

使用 ThinkPHP 測試

php artisan tinker
use App\Park;
$parks = App\Park::search('大安森林公園')->get();

新增路由

Route::get('search', 'ParksController@search')->name('search');

新增表單

<form action="{{ route('parks.search') }}" method="GET" class="form-inline" role="search">
    <div><span>資料搜尋</span>
        <input type="search" class="form-control form-control-sm mr-sm-2  ml-2" name="keyword" value="{{ $keyword ?? '' }}" placeholder="輸入關鍵字" aria-label="Search">
        <button type="submit" class="btn btn-sm btn-outline-info my-2 my-sm-0">
            <i class="fas fa-search"></i>
            搜尋
        </button>
    </div>
</form>

新增 function

/*
    台北市公園資訊 搜尋功能
*/
public function search(Request $request)
{
    $keyword = $request->keyword;
    $parks = ParkEloquent::search($keyword)->get();
    return view('parks.index',compact('parks','keyword'));
}

最後修改日期: 2020 年 12 月 1 日