2024 年 9 月 26 日: PostgreSQL 17 发布!
支持版本:当前 (17) / 16 / 15 / 14 / 13 / 12
开发版本:devel
不受支持的版本:11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3

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

有两种索引可用于加快全文搜索速度:GINGiST。请注意,索引对于全文搜索不是必需的,但在定期搜索列的情况下,通常需要索引。

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

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 可以是 tsvectortsquery 类型。可选的整数参数 siglen 确定签名长度(以字节为单位)(有关详细信息,请参见下文)。

GIN 索引是首选的文本搜索索引类型。作为倒排索引,它们包含每个词(词素)的索引条目,以及匹配位置的压缩列表。多词搜索可以找到第一个匹配项,然后使用索引删除缺少其他词的行。GIN 索引仅存储 tsvector 值的词(词素),而不是它们的权重标签。因此,在使用涉及权重的查询时,需要重新检查表行。

GiST 索引是有损的,这意味着索引可能会产生错误匹配,因此需要检查实际的表行以消除这些错误匹配。(PostgreSQL 在需要时会自动执行此操作。)GiST 索引是有损的,因为每个文档在索引中都用一个固定长度的签名表示。签名长度(以字节为单位)由可选的整数参数 siglen 的值确定。默认签名长度(当未指定 siglen 时)为 124 字节,最大签名长度为 2024 字节。签名是通过将每个词散列到 n 位字符串中的单个位中生成的,所有这些位都进行或运算以生成 n 位文档签名。当两个词散列到同一个位位置时,就会出现错误匹配。如果查询中的所有词都有匹配项(真实或错误),则必须检索表行以查看匹配项是否正确。更长的签名会导致搜索更精确(扫描较少的索引部分和较少的堆页),但代价是索引更大。

GiST 索引可以是覆盖的,即使用 INCLUDE 子句。包含的列可以具有任何 GiST 运算符类都没有的数据类型。包含的属性将以未压缩的形式存储。

由于不必要地获取最终证明为错误匹配的表记录,导致有损性导致性能下降。由于对表记录的随机访问很慢,这限制了 GiST 索引的实用性。错误匹配的可能性取决于几个因素,特别是唯一词的数量,因此建议使用词典来减少这个数量。

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

大型集合的分区和 GIN 和 GiST 索引的正确使用允许实现具有在线更新的非常快的搜索。分区可以在数据库级别使用表继承完成,或者通过将文档分布到服务器上并收集外部搜索结果来完成,例如,通过 外部数据 访问。后者之所以可行是因为排名函数仅使用本地信息。

提交更正

如果您在文档中发现任何不正确的地方,与您对特定功能的体验不符或需要进一步澄清,请使用 此表格 报告文档问题。