# 12.9.GIN和GiST索引类型
有两种索引可以用来加速全文搜索。请注意,索引不是全文搜索所必需的,但在定期搜索列的情况下,通常需要索引。
创建基于GIN(广义反向索引)的索引。这个*柱
*一定是tsvector
类型
创建索引*
名称*在*
桌子*使用要点(*
柱*[{DEFAULT | tsvector_ops}(siglen=*
数字*) ] );
创建基于GiST(通用搜索树)的索引。这个*柱
*可以是tsvector
或tsquery
类型可选整数参数西格伦
以字节为单位确定签名长度(详见下文)。
GIN索引是首选的文本搜索索引类型。作为反向索引,它们包含每个单词(词素)的索引项,以及匹配位置的压缩列表。多词搜索可以找到第一个匹配项,然后使用索引删除缺少其他词的行。GIN索引只存储tsvector
值,而不是它们的权重标签。因此,当使用涉及权重的查询时,需要重新检查表行。
一个主要的索引是有损,这意味着索引可能会产生错误匹配,需要检查实际表行以消除此类错误匹配。(PostgreSQL会在需要时自动执行此操作。)GiST索引是有损的,因为索引中的每个文档都由一个固定长度的签名表示。以字节为单位的签名长度由可选整数参数的值决定西格伦
.默认签名长度(当西格伦
未指定)为124字节,最大签名长度为2024字节。签名是通过将每个单词散列成一个n位字符串中的一个位来生成的,将所有这些位或多个位放在一起生成一个n位文档签名。当两个单词散列到相同的位位置时,将出现错误匹配。如果查询中的所有单词都匹配(真或假),则必须检索表行以查看匹配是否正确。更长的签名会导致更精确的搜索(扫描更少的索引部分和更少的堆页),但代价是索引更大。
要点索引可以覆盖,即使用包括
条款包含的列可以具有不带任何GiST运算符类的数据类型。包含的属性将以未压缩的方式存储。
丢失会导致性能下降,因为不必要地获取表记录,结果是错误的匹配。由于随机访问表记录的速度很慢,这就限制了GiST索引的实用性。错误匹配的可能性取决于几个因素,尤其是唯一单词的数量,因此建议使用字典来减少这个数量。
注意,GIN索引构建时间通常可以通过增加维修_工作_记忆,而GiST索引构建时间对该参数不敏感。
大集合的分区和GIN和GiST索引的正确使用允许通过在线更新实现非常快速的搜索。分区可以使用表继承在数据库级别完成,也可以通过在服务器上分发文档和收集外部搜索结果(例如通过国外数据通道后者是可能的,因为排名函数只使用局部信息。