MySQL如何使用SOUNDEX实现忽略首字母的内容搜索?
问题原因
MySQL 原生 SOUNDEX 算法的编码规则是:返回的 4 位编码第一位固定为输入字符串的首字母,后续三位为发音特征编码。
你的场景中两个字符串的编码结果分别为:
SOUNDEX('Hammer')→H560SOUNDEX('ammer')→A560
你现有语句是将ammer去掉末尾 0 的编码A56作为前缀匹配,Hammer的编码首字母为 H,自然无法匹配 A 开头的前缀,因此没有返回结果。
修正方案
要实现忽略首字母的发音匹配,只需要同时去掉存储字段和搜索词的 SOUNDEX 编码首字母,再做前缀匹配即可,修正后的查询如下:
SELECT * FROM product WHERE SUBSTRING(SOUNDEX(item_name), 2) LIKE CONCAT(TRIM(TRAILING '0' FROM SUBSTRING(SOUNDEX('ammer'), 2)), '%')
效果验证
上述语句中:
SUBSTRING(SOUNDEX(item_name), 2)会把所有商品名称的 SOUNDEX 编码首字母丢弃,只保留发音特征部分,Hammer处理后得到560- 搜索词
ammer处理后得到的发音特征部分为56,用56%做前缀匹配刚好可以命中560,最终返回 id 为 1 的 Hammer 记录,符合预期结果。
内容的提问来源于stack exchange,提问作者Bryan Caliwag
相关产品推荐
相关产品推荐

