搜索联想功能的核心不是“前端输几个字就发请求”,而是后端要能快速返回匹配的关键词候选项——Laravel 本身不内置联想逻辑,得靠数据库查询优化 + 接口设计来实现。
用 LIKE 还是全文索引?
简单场景下直接用 LIKE '%keyword%' 最快上手,但数据量一过万行就会明显变慢;MySQL 的 FULLTEXT 索引或 PostgreSQL 的 tsvector 更适合高并发、长文本匹配。但注意:中文分词需额外配置(如 MySQL 的 ngram 插件),否则 FULLTEXT 对中文基本无效。
- 小项目(where(‘title’, ‘like’, “%{$keyword}%”)
- 中大型项目:优先考虑
WHERE title LIKE '{$keyword}%'(前缀匹配),配合 B-Tree 索引可走索引 - 需要模糊/错别字容错:引入
pg_trgm(PostgreSQL)或第三方服务(如 Algolia、Elasticsearch)
SearchController@suggest 接口怎么写才不卡
联想接口必须限制返回数量、禁止全表扫描、避免 N+1。典型错误是查出全部匹配记录再用 PHP 截取,这会拖垮数据库连接池。