前言
Laravel Scout 是為 Eloquent model 加入全文搜尋功能的簡潔 driver-based 解決方案。透過 model observer 自動同步 Eloquent 記錄與搜尋索引。 Scout 內建database 引擎,使用 MySQL / PostgreSQL 的全文索引與 LIKE 子句直接搜尋資料庫,無需外部服務。若需要在大型正式環境中容錯拼字、多面向搜尋或地理搜尋,外部引擎會派上用場。
支援的引擎一覽
安裝
以 Composer 安裝套件。vendor:publish 指令發布設定檔。會產生 config/scout.php。
Laravel\Scout\Searchable trait。此 trait 會登記 model observer,並啟用與搜尋 driver 的自動同步。
Queue 設定
若使用database 或 collection 以外的引擎,強烈建議在使用 Scout 前先設定 queue driver。啟動 queue worker 可讓索引同步操作在背景執行,大幅提升 Web 介面回應速度。
將 config/scout.php 的 queue 選項設為 true。
使用唯一性 Job
在寫入頻繁的應用中,可能想避免同一筆 model 有重複的 queue job 被登記。可在config/scout.php 註冊 MakeSearchableUniquely 與 RemoveFromSearchUniquely job 類別以使用唯一性索引 job。通常在服務提供者的 boot 方法中設定。
Driver 前置條件
Algolia
使用 Algolia driver 時,在config/scout.php 設定 id 與 secret 認證資訊,並安裝 Algolia PHP SDK。
.env 檔加入認證資訊。
索引設定
Algolia 可在config/scout.php 管理索引設定。
scout:sync-index-settings 指令將設定同步到 Algolia。
Meilisearch
Meilisearch 是高速的開源搜尋引擎。本機開發最簡單的方式是使用 Laravel Sail 的 Docker。.env 檔設定 driver 與 host。
索引設定(Meilisearch)
Meilisearch 需將以where() 過濾的欄位事先登記在 filterableAttributes,以 orderBy() 排序的欄位登記在 sortableAttributes。
>、<)。
scout:sync-index-settings 指令。
Typesense
Typesense 是高速的開源搜尋引擎,支援關鍵字搜尋、語意搜尋、地理搜尋與向量搜尋。.env 檔設定連線資訊。
toSearchableArray 方法將 model 的主鍵轉為字串、將建立時間轉為 UNIX timestamp。
資料庫/集合引擎
不需外部服務就想加入搜尋時的最佳選項。 資料庫引擎使用 MySQL / PostgreSQL 的全文索引與LIKE 子句。對多數應用來說已足夠。
資料庫引擎與外部引擎不同,不需手動管理索引。直接搜尋資料庫資料表。
Searchable trait
自訂 toSearchableArray()
預設會把 model 的toArray() 全部資料存入搜尋索引。要自訂同步到索引的資料,覆寫 toSearchableArray 方法。
自訂索引名稱
預設使用 model 的資料表名稱(複數)作為索引名稱。可覆寫searchableAs 方法自訂。
資料庫引擎的搜尋策略
資料庫引擎可以用 PHP 屬性為每個欄位指定高效的搜尋策略。條件性設為可搜尋
若只想在特定條件下讓 model 可搜尋,定義shouldBeSearchable 方法。
索引管理
本節指令主要適用於使用 Algolia、Meilisearch、Typesense 等第三方引擎時。資料庫引擎不需管理索引。
匯入既有記錄
在既有專案導入 Scout 時,可用scout:import 指令將既有記錄匯入索引。
清空索引
要從搜尋索引移除 model 的所有記錄,使用scout:flush。
暫停索引
在 Eloquent 操作中若想暫時停止與搜尋索引的同步,使用withoutSyncingToSearch。
手動新增、移除記錄
可用查詢將 model 集合加到索引。unsearchable。
delete model 時會自動從索引中移除。
搜尋
用search 方法搜尋 model。連結 get 取得 Eloquent model 的 collection。
raw 方法。
分頁
可用paginate 方法對搜尋結果分頁。與一般 Eloquent 查詢的分頁機制相同。
simplePaginate。由於不取得總筆數,適合大型資料集。
過濾與排序
用where 方法可在搜尋查詢加入過濾條件。
query 方法自訂 Eloquent 查詢。
Eager Loading
使用 Scout 時,會先從搜尋引擎取得 ID 清單,再以 Eloquent 取得 model。為避免 N+1 問題,可在query 方法中用 with() 指定 eager loading。
makeAllSearchableUsing 方法。
軟刪除
若被索引的 model 使用軟刪除,且想同時搜尋已刪除的 model,將config/scout.php 的 soft_delete 選項設為 true。
withTrashed 或 onlyTrashed 搜尋已刪除記錄。
自訂引擎
若內建搜尋引擎不符需求,可實作自訂引擎。自訂引擎需繼承Laravel\Scout\Engines\Engine 抽象類別,並實作以下 8 個方法。
Laravel\Scout\Engines\AlgoliaEngine 類別作為實作參考。
建立好的自訂引擎,在 App\Providers\AppServiceProvider 的 boot 方法中註冊到 Scout。
config/scout.php 指定為 driver。
相關頁面
Eloquent ORM
複習 Eloquent model 的基本用法。
Eloquent Relationships
確認 relationship 的定義與 eager loading。
Queue
Scout 可搭配 queue 在背景更新索引。