GIN 接口有一个高层次的抽象,仅要求实现被访问数据类型的语义即可。GIN 层自身可以处理并发操作、记录日志、搜索树结构。
定义一个 GIN 访问方法所要做的所有事情就是实现四个用户定义的方法,这些方法定义了 key 在树中的行为、key 与 key 之间的关系、被索引的值、能够使用索引的查询。简而言之,GIN 将扩展性与普遍性、代码重用、清晰的接口结合在了一起。
一个 GIN 索引操作符类必须实现的四个方法如下:
比较两个 key(不是被索引的值!)然后返回一个小于/等于/大于零的值,分别表示第一个 key 小于/等于/大于第二个 key
返回一个其值用于索引的 key 数组,数组中元素的个数存放在 *nkeys 中。
返回一个其值用于查询的 key 数组。也就是说,query 是可索引操作符右侧的值,而该操作符左侧是被索引的字段。n 操作符类中操作符的策略号(参见 节33.14.2)。通常,extractQuery
用来通过考量 n 来决定 query 的数据类型以及需要提取的 key 值。数组中元素的个数存放在 *nkeys 中。
如果索引值满足查询策略号为 n 的操作符(或者如果该操作符在操作符类中被标记为 RECHECK 也可能满足)则返回 TRUE 。check 数组的长度必须与先前由 extractQuery
为该查询返回的 key 的数量相同。如果索引值包含相应的查询 key ,那么check 数组中的每一个元素都是 TRUE ,也就是如果 check[i] == TRUE ,那么 extractQuery
结果数组的第 i 个 key 存在于索引值当中。在 consistent
方法需要查看它的情况下,原始的 query datum(不是抽取出的 key 数组!) 将会被传递。