🧩 一、pg_trgm 在中文场景下的局限性
pg_trgm 是为**字母语言(如英语)**设计的,基于「连续 3 个字符」划分。
但中文属于「无空格、无词界」的语言,因此直接使用时存在问题:
| 示例 | 拆分结果(英文式) | 实际语义 | 影响 |
|---|---|---|---|
| 张晓明 | “张晓明” → “张晓明” (单个 trigram) | 张 + 晓 + 明 | 🔸 trigram 数量太少,匹配不精确 |
| 北京大学 | “北京大学” → “北京大”, “京大学” | 北 + 京 + 大 + 学 | 🔸 模糊程度偏弱 |
| 李小龙 | “李小龙” → “李小龙” | 李 + 小 + 龙 | ✅ 短字符串效果尚可 |
👉 结论:
对于中文短文本(<10字)效果尚可,但对于长文本或语义复杂字段(如商品描述、新闻标题),匹配精度不足。
⚙️ 二、中文优化思路总览
我们可以通过以下三种方案增强中文模糊搜索体验:

⚡ 方案一:优化 pg_trgm 参数
PostgreSQL 默认的相似度阈值 similarity_threshold 可微调:
-- 默认 0.3,中文可设为更低
SET pg_trgm.similarity_threshold = 0.2;
📊 示例对比:
SELECT name, similarity(name, '张明') AS sim
FROM users
WHERE similarity(name, '张明') > 0.2
ORDER BY sim DESC;
| name | sim | 匹配状态</ |
|---|

最低0.47元/天 解锁文章
1245

被折叠的 条评论
为什么被折叠?



