概述
模糊搜索的价值在于容忍用户拼写错误。用精确匹配或前导通配符的 LIKE 无法二者兼得:前者零召回,后者走不了索引。三元组相似度加 GIN 索引则同时解决召回与性能。
关键步骤
- 启用 pg_trgm 扩展。
- 在搜索列上用 gin_trgm_ops 创建 GIN 索引。
- 用 % 相似度操作符加阈值查询,或结合 word_similarity。
- 调整相似度阈值并用 EXPLAIN 确认索引被使用。
验证
- 拼写错误与部分词都能命中。
- EXPLAIN 显示使用三元组索引。
- 结果按相似度排序。
- 数据量增长后延迟保持较低。
注意事项
- 三元组匹配基于字符重叠而非语义,不理解含义。
- 它增加索引存储与写入成本,更适合名称类短字段而非长文档。
适用范围
本条目围绕「用 Postgres 三元组索引实现模糊搜索」给出可复制的步骤、验证方式与常见问题,适合需要按此流程落地的工程团队。执行时请结合自身上下文调整命令与阈值,并在变更前后留存证据,便于后续复核与回滚。
CREATE EXTENSION IF NOT EXISTS pg_trgm;
CREATE INDEX products_name_trgm ON products
USING gin (name gin_trgm_ops);
SELECT name FROM products
WHERE name % 'iphnoe'
ORDER BY similarity(name, 'iphnoe') DESC;