pg_trgm 是 PostgreSQL 的一个扩展模块,提供了基于 trigram(3-gram)相似度的文本搜索功能。它可以通过计算字符串之间的相似度来进行快速、模糊匹配的查询。这种功能在需要进行模糊搜索、字符串相似性比较等场景中非常有用。
Trigram 是一种基于字符三元组(3-gram)的文本处理技术。对于一个给定的字符串,pg_trgm 会将其拆分为多个连续的三元组。例如,字符串 “hello” 可以被拆分为以下 trigrams:
' h', 'he', 'ell', 'llo', 'o '
在 PostgreSQL 中,trigram 的生成包括了开头和结尾的空格字符,以捕获单词的开头和结尾。这使得 pg_trgm 能够在字符串匹配时捕捉到更多的上下文信息。
首先,你需要在 PostgreSQL 中安装 pg_trgm 扩展:
CREATE EXTENSION pg_trgm;
pg_trgm 提供了多个函数来计算字符串之间的相似度:
SELECT similarity('hello', 'hallo'); -- 返回值大约为 0.4
SELECT show_trgm('hello');
-- 返回:{" h"," he","ell","llo","lo "}
word_similarity(text, text): 专门用于单词之间相似性的比较。
strict_word_similarity(text, text): 类似 word_similarity,但要求更严格的匹配。
SELECT 'hello' % 'hallo'; -- 返回 true
通过结合 LIKE、ILIKE 或使用 % 运算符,pg_trgm 允许你进行模糊搜索。
SELECT * FROM my_table WHERE column_name % 'search_term';
这将在 column_name 中查找与 search_term 相似的所有记录。
为了加速基于 trigram 的查询,pg_trgm 允许你在文本列上创建 GIN 或 GiST 索引。
GIN 索引适合高效查找和包含搜索的场景。
CREATE INDEX trgm_idx ON my_table USING GIN (column_name gin_trgm_ops);
GiST 索引适合处理范围查询和 k 最近邻查询
CREATE INDEX trgm_gist_idx ON my_table USING GiST (column_name gist_trgm_ops);
PostgreSQL 允许你通过调整 pg_trgm.similarity_threshold 配置参数来更改相似性运算符 % 的阈值。
SET pg_trgm.similarity_threshold = 0.4;
通过这种方式,你可以控制查询结果的严格程度。
pg_trgm 是一个功能强大的 PostgreSQL 扩展,特别适用于需要模糊匹配、相似度搜索和全文检索的场景。通过结合 trigram 索引和适当的查询逻辑,可以显著提高文本查询的性能和准确性。