选择 打开 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
测试与开发版本: 19 / devel
不受支持的版本: 13 / 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0
历史版本PostgreSQL 9.0 已于 2015 年 10 月结束社区维护,本页译文保留供仍在使用旧版本的读者参考。新系统请看当前版本

F.31. pg_trgm #

pg_trgm 模块提供函数和操作符,用于基于三元组 匹配确定 ASCII 字母数字文本的相似度,同时还提供支持快速搜索相似 字符串的索引操作符类。

F.31.1. 三字符组(Trigram 或 Trigraph)概念

三字符组是一组从字符串中取出的三个连续字符。我们可以通过统计两个字符串共享的三字符组数量来度量它们的相似度。 这个简单的思想在度量许多自然语言中词的相似度时都非常有效。

注意

在确定字符串所包含的三元组集合时,认为字符串前面有两个空格, 后面有一个空格。例如,字符串 cat 的三元组集合是 ccacatat.

F.31.2. 函数和操作符

表 F.22. pg_trgm functions

Function Returns Description
similarity(text, text) real 返回一个数值,表示两个参数的相似程度。结果的范围是从零 (表示两个字符串完全不同)到一(表示两个字符串完全相同)。
show_trgm(text) text[] 返回由给定字符串中所有三元组构成的数组。(实际应用中,除了 调试之外很少有用。)
show_limit() real 返回 % 操作符当前使用的相似度阈值。它设置两个 单词被视为足够相似(例如可以看作彼此的拼写错误)所需的最小 相似度。
set_limit(real) real 设置 % 操作符当前使用的相似度阈值。阈值必须介于 0 和 1 之间(默认值为 0.3)。返回传入的相同值。

表 F.23. pg_trgm operators

Operator Returns Description
text % text boolean 如果参数之间的相似度大于 set_limit 设置的当前 相似度阈值,则返回 true

F.31.3. 索引支持

pg_trgm 模块提供 GiST 和 GIN 索引操作符类, 允许你为文本列创建索引,以实现非常快速的相似度搜索。这些索引类型 支持相似度操作符 %(而不支持其他操作符,因此 你可能还需要一个常规的 B-tree 索引)。

示例:

CREATE TABLE test_trgm (t text);
CREATE INDEX trgm_idx ON test_trgm USING gist (t gist_trgm_ops);

或者

CREATE INDEX trgm_idx ON test_trgm USING gin (t gin_trgm_ops);

此时,你已经在t列上有了一个可用于相似度搜索的索引。典型查询如下:

SELECT t, similarity(t, 'word') AS sml
  FROM test_trgm
  WHERE t % 'word'
  ORDER BY sml DESC, t;

这将返回文本列中所有与以下词足够相似的值:word,按从最佳匹配到最差匹配的顺序排序。即使在非常大的数据集上,索引也会让这一操作保持高效。

GiST 和 GIN 索引之间如何取舍,取决于二者各自的相对性能特征;相关讨论见其他章节。 作为经验法则,GIN 索引的搜索速度快于 GiST 索引,但构建或更新较慢; 因此 GIN 更适合静态数据,而 GiST 更适合经常更新的数据。

F.31.4. 文本检索集成

与全文索引结合使用时,三字符组匹配是非常有用的工具。 尤其是,它有助于识别那些因拼写错误而无法被全文检索机制直接匹配的输入词。

第一步是生成一个辅助表,其中包含文档中的全部唯一词:

CREATE TABLE words AS SELECT word FROM
        ts_stat('SELECT to_tsvector(''simple'', bodytext) FROM documents');

其中documents是一个表,包含我们希望搜索的文本字段bodytext。 之所以对to_tsvector函数使用simple配置,而不是使用特定语言的配置, 是因为我们需要原始的(未经词干提取的)词列表。

接下来,在词列上创建一个三字符组索引:

CREATE INDEX words_idx ON words USING gin (word gin_trgm_ops);

现在,可以使用与前面示例类似的SELECT查询,为用户搜索词中拼错的单词提供拼写建议。 一个有用的附加测试是要求选出的词长度也与该拼错单词相近。

注意

由于words表是作为一张独立的静态表生成的,因此需要定期重新生成, 以便与文档集合保持大致同步。 通常没有必要让它始终保持精确同步。

F.31.6. 作者

Oleg Bartunov ,俄罗斯莫斯科,莫斯科大学

Teodor Sigaev ,俄罗斯莫斯科,Delta-Soft Ltd.

文档:Christopher Kings-Lynne

本模块由俄罗斯莫斯科的 Delta-Soft Ltd. 赞助。

提交更正

译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。