前言
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 指令。
語意搜尋與混合搜尋(Meilisearch)
要在 Meilisearch 使用語意搜尋或混合搜尋,需在索引設定中指定 embedder,並在 model 設定中指定嵌入資訊。toSearchableEmbedding 方法回傳供 Laravel AI SDK 產生嵌入的來源文字,或預先計算好的嵌入陣列。設定完成後請執行 scout:sync-index-settings。
Typesense
Typesense 是高速的開源搜尋引擎,支援關鍵字搜尋、語意搜尋、地理搜尋與向量搜尋。.env 檔設定連線資訊。
toSearchableArray 方法將 model 的主鍵轉為字串、將建立時間轉為 UNIX timestamp。
語意搜尋與混合搜尋(Typesense)
要在 Typesense 啟用語意搜尋與混合搜尋,請在 model 的 Typesense 設定中定義embedding 設定與向量欄位。預設情況下,Scout 會使用 Laravel AI SDK 產生嵌入。
toSearchableEmbedding 方法可回傳 Scout 用來產生嵌入的原始文字,或事先計算好的嵌入陣列。
若使用 Typesense 原生的嵌入功能,即使沒有 Laravel AI SDK 也能產生嵌入。詳情請參閱 Typesense 官方文件。
Turbopuffer
Turbopuffer 是支援全文、語意與混合搜尋的搜尋引擎。要使用 Turbopuffer driver,請設定SCOUT_DRIVER 與 API 金鑰。
TURBOPUFFER_REGION 可省略,預設為 gcp-us-central1。
資料庫/集合引擎
不需外部服務就想加入搜尋時的最佳選項。 資料庫引擎使用 MySQL / PostgreSQL 的全文索引與LIKE 子句。對多數應用來說已足夠。
語意搜尋與混合搜尋
資料庫引擎在啟用pgvector extension 的 PostgreSQL 上支援語意搜尋與混合搜尋。在 model 的資料表加入 nullable 的向量欄位與全文索引。Scout 會在 model 儲存後才寫入嵌入,因此向量欄位必須為 nullable。
toSearchableEmbedding 方法。此方法回傳供 Scout 產生嵌入的來源文字,或預先計算好的嵌入陣列。嵌入預設儲存在 embedding 欄位,可透過 searchableEmbeddingColumn 方法變更。
集合引擎在 PHP 內過濾,能在包括 SQLite 在內的所有 Laravel 支援的資料庫上運作。適合本機開發、測試、小資料集。
資料庫引擎與外部引擎不同,不需手動管理索引。直接搜尋資料庫資料表。
Turbopuffer 的設定
Turbopuffer 需針對每個 model,在config/scout.php 的 model-settings 中定義可搜尋屬性與 schema。
searchable-attributes 的數值是 BM25 的相對權重。在此範例中,標題的比對對分數的貢獻是內文的 3 倍。要使用語意搜尋時,請加入 embedding 設定與向量的 schema,並讓 model 的 toSearchableEmbedding 方法回傳來源文字或嵌入陣列。
toSearchableEmbedding。將嵌入的來源屬性包含在 toSearchableArray 的回傳值中,並如下設定。
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 方法。
語意搜尋
在已設定嵌入的database、Meilisearch、Typesense、Turbopuffer 引擎中,可依查詢的語意搜尋記錄。在搜尋查詢加上 semantic 方法。若由 Scout 產生嵌入,語意搜尋與混合搜尋需要 Laravel AI SDK。若使用 Typesense 原生嵌入、Turbopuffer 原生嵌入,或事先計算好的查詢向量,則不需要 Laravel AI SDK。
hybrid 方法。透過引數可指定文字搜尋與語意搜尋的相對權重。
分頁
可用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 在背景更新索引。