简介
给应用添加搜索功能有多种方式。Laravel 内置了从关键字匹配到基于 AI 的语义检索等一整套工具,很多场景无需引入外部服务。功能对比
| 功能 | 外部服务 | 特点 |
|---|---|---|
whereFullText | 不需要 | MariaDB / MySQL / PostgreSQL 内置的全文索引 |
whereVectorSimilarTo | 不需要(PostgreSQL + pgvector) | 基于语义相似度搜索,需要 AI SDK |
Reranking | AI 提供商 | 用 AI 对任意结果集按相关度重新排序 |
| Laravel Scout | 不需要(database 引擎)/ 可选 | Eloquent 模型自动同步索引 |
全文检索
LIKE 查询适合简单的模糊匹配,但它并不理解语言。全文检索通过专用索引理解词边界、词形变化和相关度评分。
MariaDB、MySQL、PostgreSQL 都原生支持全文检索,无需外部服务。
添加全文索引
要使用全文检索,先在对应列上添加全文索引。中文全文检索的注意事项
MySQL 的中文全文检索使用起来较为受限。AWS RDS 上只能使用 N-gram 解析器,不能安装分词插件;Laravel Cloud 上的 MySQL 也是如此。PostgreSQL 对中文分词的支持同样有限。如果你对中文检索精度要求较高,建议考虑 Meilisearch、Typesense 等专用搜索引擎。
执行全文查询
添加索引后,使用whereFullText 方法进行搜索。Laravel 会根据你使用的数据库驱动生成合适的 SQL(MariaDB / MySQL 生成 MATCH(...) AGAINST(...),PostgreSQL 生成 to_tsvector(...) @@ plainto_tsquery(...))。
MariaDB 和 MySQL 会自动按相关度排序返回结果。PostgreSQL 中的
whereFullText 只是过滤匹配的记录,不做相关度排序。如果需要在 PostgreSQL 上自动按相关度排序,可以使用 Scout 的 database 引擎。orWhereFullText 方法在 OR 条件下添加全文搜索。更多细节请参考查询构造器文档。
语义 / 向量检索
全文检索依赖关键字匹配。向量检索则完全不同:它使用 AI 生成的向量嵌入把文本的语义表示为数值数组,再基于语义相近程度进行搜索。 比如搜索 “best wineries in Napa Valley” 可以匹配到标题为 “Top Vineyards to Visit” 的文章,即便词语不完全一样,语义仍然相近。向量检索需要 Laravel AI SDK,支持 PostgreSQL(需要
pgvector 扩展)与 MongoDB(需要 Laravel MongoDB 扩展包)。Laravel Cloud 上的所有 Postgres 数据库都已预装 pgvector。生成嵌入向量
嵌入向量是表示文本语义的高维数值数组(通常几百到几千维)。可以使用 LaravelStringable 类的 toEmbeddings 方法生成。
Embeddings 类,一次 API 调用即可完成。
存储向量与创建索引
要保存向量嵌入,需要在迁移中定义vector 列。请根据所用嵌入提供商的输出维度指定 dimensions(例如 OpenAI 的 text-embedding-3-small 是 1536 维)。调用 index() 创建 HNSW 索引后,大数据集上的相似度检索会显著加速。
embedding 列 cast 为 array,可以让 PHP 数组与数据库向量格式自动互转。
按相似度检索
保存好嵌入后,可以用whereVectorSimilarTo 方法查询相似记录。它使用余弦相似度比较向量,按 minSimilarity 阈值过滤,并按相关度从高到低自动排序。阈值取 0.0~1.0,1.0 表示完全一致。
whereVectorDistanceLessThan、selectVectorDistance、orderByVectorDistance。详情请参考查询构造器文档和 AI SDK 文档。
重排序(Reranking)
重排序是让 AI 模型按查询相关度对结果集重新排序的技术。与向量检索不同,重排序无需预先计算和存储嵌入,任何文本集合都可以直接使用。 “先检索、再重排”是一种非常有效的模式:先用全文检索快速缩小候选,再用 AI 精细排序,可以同时兼顾数据库速度与 AI 精度。rerank 宏,只需传入字段名(或闭包)和查询词,就能对 Eloquent 结果重排序。
Laravel Scout
前面介绍的方法都是直接调用查询构造器方法。Laravel Scout 采用不同的思路:给 Eloquent 模型添加Searchable trait 后,Scout 会随着模型的创建、更新、删除自动同步搜索索引。
database 引擎
Scout 内置的 database 引擎会在你现有的数据库上执行全文搜索与LIKE 搜索。既不需要外部服务,也不需要额外基础设施。
通过 toSearchableArray 方法定义要参与检索的字段。PHP Attribute 可以为每个字段指定检索策略。
| Attribute | 检索策略 |
|---|---|
SearchUsingFullText | 使用全文索引(MATCH...AGAINST / to_tsvector) |
SearchUsingPrefix | 前缀匹配(example%) |
| 无 | 前后通配符(%example%) |
search 方法查询模型。Scout 的 database 引擎在 PostgreSQL 上也会自动按相关度排序返回结果。
第三方引擎
Scout 也支持 Algolia、Meilisearch、Typesense 等第三方搜索引擎,它们提供拼写容错、分面搜索、地理搜索、自定义排序等高级功能。 Scout 提供了统一的 API,因此后续若要从 database 引擎迁移到第三方引擎,代码改动会非常小。多数应用不需要外部搜索引擎。本页介绍的内置方案已经能覆盖大多数场景。
组合使用
上述搜索方式并不互相排斥,组合起来往往效果更佳。全文检索 + 重排序
先用全文检索快速筛出候选,再用重排序按语义关联度排序。是兼顾数据库速度和 AI 精度的一种模式。向量检索 + 常规过滤
把向量相似度搜索和普通的where 子句结合,可以在特定子集内做语义搜索。适合按团队或分类筛选后再进行语义查询的场景。
相关页面
Laravel Scout
使用 Searchable trait 自动同步模型索引的完整指南。
Laravel AI SDK
向量嵌入与重排序所需的 AI SDK 配置方法。
查询构造器
whereFullText、whereVectorSimilarTo 等查询构造器方法的详细说明。
迁移
全文索引和向量列的创建方法。