↑↓ 选择↵ 打开⌫ 切换范围完整搜索

PG.CENTER 连接 PostgreSQL 文档、百科与生态知识。由 Pigsty 维护。

支持中的版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发中的版本: 19 / 20devel
已结束支持的版本: 13 / 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3

12.9. 文本检索的首选索引类型 #

有两种索引可以用来加速全文检索:GIN 和 GiST。请注意,索引对于全文检索并非强制要求,但在定期搜索某一列的情况下,通常是可取的。

要创建这样的索引,请执行以下操作之一:

CREATE INDEX name ON table USING GIN (column); #

创建基于 GIN(广义倒排索引)的索引。column 必须是 tsvector 类型。

CREATE INDEX name ON table USING GIST (column [ { DEFAULT | tsvector_ops } (siglen = number) ] ); #

创建基于 GiST(广义搜索树)的索引。column 可以是 tsvector 或 tsquery 类型。可选的整数参数 siglen 确定以字节为单位的签名长度(有关详细信息,请参见下文)。

GIN 索引是文本检索的首选索引类型。作为倒排索引,每个词(词位)在其中都有一个索引项,其中有压缩过的匹配位置的列表。多词搜索可以找到第一个匹配,然后使用该索引移除缺少额外词的行。GIN 索引只存储 tsvector 值的词(词位),并且不存储它们的权重标签。因此,在使用涉及权重的查询时需要一次在表行上的重新检查。

一个 GiST 索引是有损的,这表示索引可能产生假匹配,并且有必要检查真实的表行来消除这种假匹配(PostgreSQL 在需要时会自动做这一步)。GiST 索引之所以是有损的,是因为每一个文档在索引中被表示为一个定长的签名。以字节为单位的签名长度由可选整数参数 siglen 的值决定。默认签名长度(未指定 siglen 时)为 124 字节,最大签名长度为 2024 字节。该签名通过将每个词 hash 到一个 n 位串中的一位,再将所有这些位进行 OR 运算来生成,结果是一个 n 位的文档签名。当两个词 hash 到同一个位位置时就会产生假匹配。如果查询中所有词都有匹配(真或假),则必须检索表行查看匹配是否正确。更长的签名导致更精确的搜索(扫描更小比例的索引和更少的堆页面),但代价是更大的索引。

GiST 可以构建为覆盖索引,即使用 INCLUDE 子句。内含列可以具有没有任何 GiST 操作符类的数据类型。内含属性会以未压缩形式存储。

有损性导致的性能下降归因于不必要的表记录(即被证实为假匹配的记录)获取。因为表记录的随机访问是较慢的,这限制了 GiST 索引的实用性。假匹配的可能性取决于几个因素,特别是不同词的数量,因此推荐使用词典来缩减这个数量。

注意 GIN 索引的构建时间常常可以通过增加 maintenance_work_mem 来缩短,而 GiST 索引的构建时间则对该参数不敏感。

对大集合分区并正确使用 GIN 和 GiST 索引允许实现带在线更新的快速搜索。分区可以在数据库层面上使用表继承来完成,或者是通过将文档分布在服务器上并收集外部的搜索结果,例如通过外部数据访问。后者是可能的,因为排名函数只使用本地信息。

报告文档问题

阅读 上游文档. 通过 PostgreSQL 文档反馈表单.