支持的版本:当前 (17) / 16 / 15 / 14 / 13
开发版本:devel
不支持的版本:12 / 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 索引,可以实现使用在线更新的非常快速的搜索。可以使用表继承在数据库级别进行分区,或者通过在服务器上分发文档并收集外部搜索结果(例如,通过 外部数据 访问)来进行分区。 后者之所以可行,是因为排名函数仅使用本地信息。

提交更正

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