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

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.xdnf.cn/news/15601.html

相关文章:

  • 命名实体识别15年研究全景:从规则到机器学习的演进(1991-2006)
  • Python 基础语法与数据类型(十三) - 实例方法、类方法、静态方法
  • SAP-ABAP:SAP的‘cl_http_utility=>escape_url‘对URL进行安全编码方法详解
  • Linux Swap区深度解析:为何禁用?何时需要?
  • 【程序地址空间】虚拟地址与页表转化
  • 基于Rust游戏引擎实践(Game)
  • 线上项目https看不了http的图片解决
  • 在分布式系统中,如何保证缓存与数据库的数据一致性?
  • docker 容器无法使用dns解析域名异常问题排查
  • springboot 整合spring-kafka客户端:SASL_SSL+PLAINTEXT方式
  • LeetCode20
  • 边界路由器
  • Baumer工业相机堡盟工业相机如何通过YoloV8模型实现人物识别(C#)
  • 如何做好DNA-SIP?
  • Redis完全指南:从基础到实战(含缓存问题、布隆过滤器、持久化及Spring Boot集成)
  • 数据结构 栈(2)--栈的实现
  • 4.PCL点云的数据结构
  • 「Chrome 开发环境快速屏蔽 CORS 跨域限制详细教程」*
  • springboot跨域问题 和 401
  • 人工智能基础知识笔记十四:文本转换成向量
  • Android 实现:当后台数据限制开启时,仅限制互联网APN。
  • 什么是“数据闭环”
  • Docker-Beta?ollama的完美替代品
  • MySQL高可用集群架构:主从复制、MGR与读写分离实战
  • TDengine 的可视化数据库操作工具 taosExplorer(安装包自带)
  • VMware Workstation Pro 17下载安装
  • VR全景园区:开启智慧园区新时代
  • 基于C#+SQlite开发(WinForm)个人日程管理系统
  • 【leetcode】852. 山脉数组的封顶索引
  • 树莓派Qt 安装