前言
為應用程式加入搜尋功能有多種方式,取決於用途。Laravel 提供從關鍵字比對到使用 AI 的語意搜尋,無需外部服務即可運作的內建工具。功能比較
全文檢索
LIKE 查詢對簡單的部分比對很方便,但不理解語言。全文檢索使用專用索引,考量單詞邊界、語形變化與關聯度分數進行搜尋。
MariaDB、MySQL、PostgreSQL 都內建支援全文檢索,不需要外部服務。
加入全文索引
要使用全文檢索,先為目標欄位加上全文索引。中文全文檢索的注意事項
MySQL 對中文全文檢索的處理較不友善。中文與日文一樣,多需搭配專用分詞器。如 AWS RDS 上僅可使用 N-gram parser,無法加入形態解析外掛。Laravel Cloud 的 MySQL 也是類似情況。PostgreSQL 對中文語形變化支援亦有限。若中文搜尋準確度重要,可考慮使用 Meilisearch 或 Typesense 等專用引擎。
MySQL 對中文全文檢索的處理較不友善。中文與日文一樣,多需搭配專用分詞器。如 AWS RDS 上僅可使用 N-gram parser,無法加入形態解析外掛。Laravel Cloud 的 MySQL 也是類似情況。PostgreSQL 對中文語形變化支援亦有限。若中文搜尋準確度重要,可考慮使用 Meilisearch 或 Typesense 等專用引擎。
執行全文查詢
加入索引後,用whereFullText 方法搜尋。Laravel 會依所使用的資料庫 driver 產生合適的 SQL(MariaDB / MySQL 為 MATCH(...) AGAINST(...),PostgreSQL 為 to_tsvector(...) @@ plainto_tsquery(...))。
MariaDB、MySQL 中結果會自動依關聯度分數排序。而 PostgreSQL 的
whereFullText 只是過濾符合的記錄,並不會依關聯度排序。若在 PostgreSQL 希望自動關聯度排序,可用 Scout 的資料庫引擎。orWhereFullText 方法可以以 OR 條件加入全文檢索。詳細請參閱查詢建構器文件。
語意/向量搜尋
全文檢索依賴關鍵字的比對。向量搜尋採取根本不同的做法,將 AI 產生的向量嵌入視為文字語意的數值陣列,搜尋語意上相近的結果。 例如以「best wineries in Napa Valley」搜尋時,可以命中標題為「Top Vineyards to Visit」的文章。即使單詞不同,語意相近。向量搜尋需要 Laravel AI SDK,支援 PostgreSQL(需
pgvector extension)與 MongoDB(需 Laravel MongoDB 套件)。Laravel Cloud 所有 Postgres 資料庫都已預裝 pgvector。產生嵌入
嵌入是表達文字語意的高維數值陣列(通常數百至數千維)。可用 Laravel 的Stringable 類別的 toEmbeddings 方法產生。
Embeddings 類別更有效率(可用一次 API 呼叫)。
向量的儲存與索引建立
要儲存向量嵌入,在 migration 定義vector 欄位。依嵌入供應商的輸出維度指定 dimensions(如 OpenAI 的 text-embedding-3-small 為 1536 維)。呼叫 index() 建立 HNSW 索引,可大幅加速大型資料集的相似搜尋。
embedding 欄位 cast 為 array,自動處理 PHP 陣列與資料庫向量格式的轉換。
以相似度搜尋
儲存嵌入後,可用whereVectorSimilarTo 方法搜尋相似記錄。使用 cosine similarity 比較向量,過濾掉 minSimilarity 門檻以下的結果,並依關聯度高至低自動排序。門檻為 0.0〜1.0,1.0 表示完全相符。
whereVectorDistanceLessThan、selectVectorDistance、orderByVectorDistance。詳情請參閱查詢建構器文件與 AI SDK 文件。
Reranking
Reranking 是 AI 模型將結果集依查詢的關聯度重新排序的方法。與向量搜尋不同,不需事先計算或儲存嵌入,可套用於任意文字集合。 先用全文檢索快速篩出大量記錄,再套用 rerank 的「搜尋→重排」模式尤其有效。可兼顧資料庫速度與 AI 精度。rerank macro,只要傳入欄位名稱(或 closure)與查詢就能對 Eloquent 結果重排。
Laravel Scout
前述搜尋方法都是直接呼叫查詢建構器的方法。Laravel Scout 採取不同做法:在 Eloquent model 加入Searchable trait,Scout 就會依記錄的建立、更新、刪除自動同步搜尋索引。
資料庫引擎
Scout 內建的資料庫引擎會對既有資料庫進行全文檢索與LIKE 搜尋,無需外部服務或額外基礎架構。
以 toSearchableArray 方法定義搜尋對象欄位。可用 PHP 屬性為每欄指定搜尋策略。
加上 trait 後,可用
search 方法搜尋 model。Scout 的資料庫引擎在 PostgreSQL 也會自動回傳依關聯度排序的結果。
第三方引擎
Scout 也支援 Algolia、Meilisearch、Typesense 等第三方搜尋引擎。這些提供拼字容錯、多面向搜尋、地理搜尋、自訂排名等進階功能。 Scout 提供統一 API,之後從資料庫引擎遷移到第三方引擎時,程式碼變動極小。多數應用程式並不需要外部搜尋引擎。本頁介紹的內建做法可涵蓋大多數情境。
技術組合
前述搜尋方法並非互斥。組合使用可獲得最佳結果。全文檢索 + Reranking
用全文檢索快速篩出候選,再用 Reranking 依語意關聯度重排。是同時兼顧資料庫速度與 AI 精度的模式。向量搜尋 + 一般過濾
結合向量相似搜尋與一般where 子句,實現對特定子集的語意搜尋。適用於在依團隊或分類篩選同時進行語意搜尋。
相關頁面
Laravel Scout
以 Searchable trait 自動同步 model 索引的完整指南。
Laravel AI SDK
向量嵌入與 rerank 所需 AI SDK 的設定方式。
查詢建構器
whereFullText、whereVectorSimilarTo 等查詢建構器方法的細節。
Migration
全文索引與向量欄位的建立方式。