GIN 代表广义倒排索引。GIN 旨在处理待索引项为复合值的情况,并且索引需要处理的查询需要搜索出现在复合项中的元素值。例如,项可以是文档,而查询可以是搜索包含特定单词的文档。
我们使用单词项来指代待索引的复合值,并使用单词键来指代元素值。GIN 始终存储和搜索键,而不是项值本身。
GIN 索引存储一组(键、发布列表)对,其中发布列表是键出现的行 ID 的集合。由于项可以包含多个键,因此同一个行 ID 可以在多个发布列表中出现。每个键值仅存储一次,因此对于键多次出现的案例,GIN 索引非常紧凑。
GIN 是广义的,因为GIN 访问方法代码不需要知道它加速的具体操作。相反,它使用为特定数据类型定义的自定义策略。该策略定义如何从索引项和查询条件中提取键,以及如何确定包含查询中某些键值的行是否实际满足查询。
使用 GIN 的一个优点是,它允许数据类型专家(而不是数据库专家)通过适当的访问方法开发自定义数据类型。这与使用 GiST 具有非常相似的优点。
PostgreSQL 中的 GIN 实现主要由 Teodor Sigaev 和 Oleg Bartunov 维护。有关 GIN 的更多信息,请访问他们的 网站。