
MySQL 本身不提供像 elasticsearch 或 solr 那样的原生搜索推荐(如拼音容错、同义词扩展、热度排序、实时联想)能力,但可以通过合理设计和 SQL 技巧,在中小规模场景下实现轻量、可用、低延迟的基础搜索推荐功能,比如用户输入“苹”时提示“苹果”“苹果手机”“苹果笔记本”等已存在的关键词。
一、用 LIKE + 前缀匹配实现简单关键词联想
这是最直接的方式,适用于搜索词较短、数据量不大(百万级以内)、且用户主要输入前缀的场景(如搜索框自动补全)。
- 确保被搜索字段(如 title 或 keyword)上有 B-tree 索引(前缀索引需谨慎,建议整列索引或使用足够长的前缀)
- SQL 示例:select DISTINCT keyword FROM products WHERE keyword LIKE ‘苹%’ ORDER BY keyword LIMIT 5;
- 注意:LIKE ‘苹%’ 可走索引;但 LIKE ‘%苹%’ 或 LIKE ‘%苹%’ 无法使用索引,性能差,应避免
二、用全文索引(FULLTEXT)提升相关性排序
当需要支持“包含多个词”“顺序无关”“权重排序”时,MyISAM 或 InnoDB 的 FULLTEXT 索引更合适(推荐 InnoDB,支持事务)。
- 建表时添加:FULLTEXT(title, description)
- 查询示例:SELECT title, MATCH(title, description) AGaiNST(‘苹果 手机’ IN NATURAL LANGUAGE MODE) AS score FROM products WHERE MATCH(title, description) AGAINST(‘苹果 手机’ IN NATURAL LANGUAGE MODE) ORDER BY score DESC LIMIT 5;
- 注意:自然语言模式对短词(如单字)支持弱;布尔模式(IN Boolean MODE)可支持+、-、*通配,但不计算相关度分数
三、预生成热门/高频搜索词用于快速推荐
真正实用的推荐往往不是“实时查全表”,而是基于历史行为沉淀出“热搜词”“关联词”“补全候选池”。
- 建一张 search_suggestion 表,字段如:keyword VARCHAR(100), freq int, updated_at DATETIME
- 通过定时任务(如每天凌晨)统计用户搜索日志表中出现次数 Top 1000 的词,写入该表
- 前端输入时,先查这张轻量表:SELECT keyword FROM search_suggestion WHERE keyword LIKE ‘苹%’ ORDER BY freq DESC LIMIT 5;
- 优势:响应快、可控性强、可人工干预(如置顶“iphone 15”)、便于加权(点击多的排前面)
四、结合拼音模糊提升中文体验(可选增强)
用户可能输拼音首字母(如“pg”想搜“苹果”),可额外维护一个 pinyin_prefix 字段并建立索引。
- 插入/更新数据时,用程序(php/python/java)将标题转为小写拼音首字母,例如“苹果”→“pg”,“苹果手机”→“pgsj”,存入新字段
- 查询:SELECT keyword FROM products WHERE pinyin_prefix LIKE ‘pg%’ ORDER BY freq DESC LIMIT 5;
- 也可用 MySQL 内置函数(如 CONVERT(… using gbk) 配合自定义函数),但稳定性与性能不如应用层处理
不复杂但容易忽略:推荐效果好坏,80% 取决于数据质量与业务理解——比如电商要区分“苹果(水果)”和“苹果(品牌)”,可通过类目标签或上下文字段做二次过滤。MySQL 能打好基础,但别强求它替代专业搜索中间件。