# 12.9.GIN和GiST索引类型

有两种索引可以用来加速全文搜索。请注意,索引不是全文搜索所必需的,但在定期搜索列的情况下,通常需要索引。

创建索引*名称*在*桌子*用杜松子酒(**);

创建基于GIN(广义反向索引)的索引。这个**一定是tsvector类型

创建索引*名称*在*桌子*使用要点(**[{DEFAULT | tsvector_ops}(siglen=*数字*) ] );

创建基于GiST(通用搜索树)的索引。这个**可以是tsvectortsquery类型可选整数参数西格伦以字节为单位确定签名长度(详见下文)。

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

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

要点索引可以覆盖,即使用包括条款包含的列可以具有不带任何GiST运算符类的数据类型。包含的属性将以未压缩的方式存储。

丢失会导致性能下降,因为不必要地获取表记录,结果是错误的匹配。由于随机访问表记录的速度很慢,这就限制了GiST索引的实用性。错误匹配的可能性取决于几个因素,尤其是唯一单词的数量,因此建议使用字典来减少这个数量。

注意,GIN索引构建时间通常可以通过增加维修_工作_记忆,而GiST索引构建时间对该参数不敏感。

大集合的分区和GIN和GiST索引的正确使用允许通过在线更新实现非常快速的搜索。分区可以使用表继承在数据库级别完成,也可以通过在服务器上分发文档和收集外部搜索结果(例如通过国外数据通道后者是可能的,因为排名函数只使用局部信息。