当前位置: 首页 > news >正文

PostgreSQL 中的 pg_trgm 扩展详解

PostgreSQL 中的 pg_trgm 扩展详解

pg_trgm 是 PostgreSQL 提供的一个核心扩展,用于实现基于三元组(trigram)的文本相似度计算和高效搜索。它特别适合优化模糊匹配、部分匹配和相似度查询。

核心功能

  1. 三元组(trigram)概念

    • 将字符串拆解为连续的3个字符组
    • 例如:“hello” → [" h", " he", “hel”, “ell”, “llo”, "lo "]
  2. 主要用途

    • 优化 LIKE '%pattern%' 查询
    • 实现模糊匹配和相似度计算
    • 支持正则表达式搜索优化

使用方法

1. 安装扩展

CREATE EXTENSION pg_trgm;

2. 创建GIN/GIST索引

-- GIN索引(查询更快,占用空间稍大)
CREATE INDEX idx_name_trgm ON table_name USING gin(column_name gin_trgm_ops);-- GIST索引(插入更快,查询稍慢)
CREATE INDEX idx_name_trgm ON table_name USING gist(column_name gist_trgm_ops);

实际应用场景

1. 优化模糊查询

-- 不使用索引(全表扫描)
SELECT * FROM products WHERE description LIKE '%premium%';-- 使用pg_trgm索引
SELECT * FROM products WHERE description LIKE '%premium%';  -- 自动使用索引

2. 相似度搜索

-- 计算相似度(0-1之间)
SELECT similarity('hello', 'hell'), similarity('hello', 'world');-- 查找相似记录
SELECT * FROM products 
ORDER BY similarity(name, 'Adidas Originals') DESC
LIMIT 5;

3. 高级文本搜索

-- %和_通配符优化
SELECT * FROM users WHERE username LIKE '%john%';-- 正则表达式优化
SELECT * FROM logs WHERE message ~ 'error[0-9]{4}';

性能特点

特性说明
索引大小比标准B-tree大2-3倍
写入性能比B-tree稍慢
查询性能模糊查询快10-100倍
支持操作LIKE, ILIKE, ~, ~*, =, similarity()

注意事项

  1. 短字符串效果差:少于3个字符的单词无法生成有效的trigram
  2. 索引大小:trigram索引通常比普通索引大
  3. 语言支持:对非ASCII字符(如中文)需要特殊处理
  4. 最佳实践
    -- 结合普通索引使用
    CREATE INDEX idx_name ON users(name);
    CREATE INDEX idx_name_trgm ON users USING gin(name gin_trgm_ops);
    

pg_trgm是PostgreSQL文本搜索的利器,特别适合实现"Google-like"的模糊搜索功能。

http://www.dtcms.com/a/285187.html

相关文章:

  • docker 安装nacos
  • Content-Type 请求头
  • 求解偏微分方程的傅里叶积分解
  • 【C语言进阶】内存函数
  • app打包ios上架appStore流程
  • 强化第三讲—一元函数微分学的概念
  • vue + Cesium 实现 3D 地图水面效果详解
  • Leetcode刷题营第二十七题:二叉树的最大深度
  • 研二Last Day
  • 【保姆级喂饭教程】idea开发TODO规范
  • 【项目实践08】【事务加锁的问题】
  • 【C++类和对象解密】面向对象编程的核心概念(下)
  • openinstall上线SSL证书服务,开启数字安全新纪元
  • 从现场出发:能源系统中的智能设备与实际落地工具解读
  • 7 基本的空间关系判断
  • Git仓库核心概念与工作流程详解:从入门到精通
  • 「Java案例」递归实现整数的倒置
  • MyBatis-Flex 学习与整理
  • LeNet-5 详解:从理论到实践
  • HTML前端性能优化完整指南
  • LeetCode 234:回文链表
  • 文件类型说明
  • H7-TOOL脱机下载后,自动重连RTT,CAN和串口助手三合一模式方法,方便项目测试(2025-07-16)
  • Spring Boot 分层架构详解:Controller、Service、Mapper...
  • C++网络编程 5.TCP套接字(socket)通信进阶-基于多线程的TCP多客户端通信
  • 鸿蒙状态栏操作
  • 能碳管理平台:企业碳减排解决方案绿色工厂达标工具
  • Trae IDE:打造完美Java开发环境的实战指南
  • 基于深度学习的电信号分类识别与混淆矩阵分析
  • AI 总结工作报告