有两种索引可用于加速全文搜索: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 索引,可以实现使用在线更新的非常快速的搜索。可以使用表继承在数据库级别进行分区,或者通过在服务器上分发文档并收集外部搜索结果(例如,通过 外部数据 访问)来进行分区。 后者之所以可行,是因为排名函数仅使用本地信息。
如果您发现文档中的任何内容不正确,与您使用特定功能的体验不符或需要进一步澄清,请使用此表单报告文档问题。