【问题标题】:How to create support functions for gin index on custom operator class in postgres?如何在 postgres 中的自定义运算符类上为 gin 索引创建支持函数?
【发布时间】:2021-02-24 01:01:19
【问题描述】:

我为 jsonb 类型创建了一些自定义运算符,并为它们创建了一个类。问题是当我创建索引时

CREATE INDEX idx_name on table USING gin(column_name custom_operator_class)

我收到一个错误

missing support function 2 for attribute 1 of index "idx_name"

我可能需要为重叠、包含、包含和相等创建支持类,但我没有找到任何关于如何做到这一点的文档。我在网上找到的都是 btree,而杜松子酒没有。有谁知道如何做到这一点,或者我可以找到一些例子的任何材料?

如果您需要更多信息,我很乐意多说。运算符基本上用于递归搜索日期小于,大于,等于指定的键

编辑:

我尝试创建这样的支持函数

CREATE OR REPLACE FUNCTION jb_custom_contains(jsonb, jsonb)
RETURNS bool AS
'SELECT $1 <@ $2' LANGUAGE sql IMMUTABLE;

CREATE OR REPLACE FUNCTION jb_custom_contaiedBy(jsonb, jsonb)
RETURNS bool AS
'SELECT $1 @> $2' LANGUAGE sql IMMUTABLE;

CREATE OR REPLACE FUNCTION jb_custom_equals(jsonb, jsonb)
RETURNS bool AS
'SELECT $1 = $2' LANGUAGE sql IMMUTABLE;

CREATE INDEX 则不会返回错误,但操作符将无法正常工作

【问题讨论】:

    标签: postgresql indexing


    【解决方案1】:

    您将策略编号与支持功能编号混淆了。

    这在官方文档的table 37.13chapter 66中有记载,里面有例子链接。

    【讨论】:

    • 我在创建问题时犯了一个错误。我的意思是支持重叠、包含、包含和相等的函数。我读了那些章节,我仍然不确定。因为我正在为 jsonb 创建一个运算符,这是否意味着我可以使用已经实现的 jsonb 支持函数,或者我必须创建新的?
    • 我用我试图让它工作的东西编辑了这个问题
    【解决方案2】:

    解释你的错误信息:

    支持函数2定义在src/include/access/gin.h:

    /*
     * amproc indexes for inverted indexes.
     */
    #define GIN_COMPARE_PROC               1
    #define GIN_EXTRACTVALUE_PROC          2
    #define GIN_EXTRACTQUERY_PROC          3
    #define GIN_CONSISTENT_PROC            4
    #define GIN_COMPARE_PARTIAL_PROC       5
    #define GIN_TRICONSISTENT_PROC         6
    #define GIN_OPTIONS_PROC       7
    #define GINNProcs                      7
    

    即支持函数2就是the documentation中描述的extractValue

    GIN 的操作符类必须提供两种方法:

    Datum *extractValue(Datum itemValue, int32 *nkeys, bool **nullFlags)
    

    给定要索引的项目,返回一个 palloc 的键数组。返回的密钥数量必须存储在*nkeys 中。如果任何键可以为空,则还分配一个*nkeysbool 字段数组,将其地址存储在*nullFlags,并根据需要设置这些空标志。 *nullFlags 可以保留 NULL(它的初始值),如果所有的键都是非空的。如果项目不包含键,则返回值可以是NULL

    所以您的CREATE OPERATOR CLASS 声明中缺少以下内容:

    CREATE OPERATOR CLASS custom_operator_class FOR TYPE jsonb USING gin AS
       FUNCTION 2 myextractvaluefunc(jsonb, internal),
       ...;
    

    【讨论】:

    • 这很有帮助,谢谢。我想我在理解该函数的外观时遇到了问题。我认为我可以只使用已经实现的功能,因为我正在为 jsonb 类型编写它。而且因为我有更多,更少的功能,我不明白提取价值如何适合所有这些。
    猜你喜欢
    • 1970-01-01
    • 2018-05-12
    • 1970-01-01
    • 2021-06-01
    • 2020-06-04
    • 1970-01-01
    • 1970-01-01
    • 2019-01-01
    • 2015-06-05
    相关资源
    最近更新 更多