有两种索引可用于加快全文搜索速度:GIN 和 GiST。请注意,索引对于全文搜索不是必需的,但在定期搜索列的情况下,通常需要索引。
要创建这样的索引,请执行以下操作之一
GIN 索引是首选的文本搜索索引类型。作为倒排索引,它们包含每个词(词素)的索引条目,以及匹配位置的压缩列表。多词搜索可以找到第一个匹配项,然后使用索引删除缺少其他词的行。GIN 索引仅存储 tsvector
值的词(词素),而不是它们的权重标签。因此,在使用涉及权重的查询时,需要重新检查表行。
GiST 索引是有损的,这意味着索引可能会产生错误匹配,因此需要检查实际的表行以消除这些错误匹配。(PostgreSQL 在需要时会自动执行此操作。)GiST 索引是有损的,因为每个文档在索引中都用一个固定长度的签名表示。签名长度(以字节为单位)由可选的整数参数 siglen
的值确定。默认签名长度(当未指定 siglen
时)为 124 字节,最大签名长度为 2024 字节。签名是通过将每个词散列到 n 位字符串中的单个位中生成的,所有这些位都进行或运算以生成 n 位文档签名。当两个词散列到同一个位位置时,就会出现错误匹配。如果查询中的所有词都有匹配项(真实或错误),则必须检索表行以查看匹配项是否正确。更长的签名会导致搜索更精确(扫描较少的索引部分和较少的堆页),但代价是索引更大。
GiST 索引可以是覆盖的,即使用 INCLUDE
子句。包含的列可以具有任何 GiST 运算符类都没有的数据类型。包含的属性将以未压缩的形式存储。
由于不必要地获取最终证明为错误匹配的表记录,导致有损性导致性能下降。由于对表记录的随机访问很慢,这限制了 GiST 索引的实用性。错误匹配的可能性取决于几个因素,特别是唯一词的数量,因此建议使用词典来减少这个数量。
请注意GIN索引构建时间通常可以通过增加 maintenance_work_mem 来提高,而GiST索引构建时间对该参数不敏感。
大型集合的分区和 GIN 和 GiST 索引的正确使用允许实现具有在线更新的非常快的搜索。分区可以在数据库级别使用表继承完成,或者通过将文档分布到服务器上并收集外部搜索结果来完成,例如,通过 外部数据 访问。后者之所以可行是因为排名函数仅使用本地信息。
如果您在文档中发现任何不正确的地方,与您对特定功能的体验不符或需要进一步澄清,请使用 此表格 报告文档问题。