这是我的桌子:
CREATE TABLE
mytable
(
id INT NOT NULL PRIMARY KEY,
val int4range[]
);
我想索引val列:
CREATE INDEX
ix_mytable_val
ON mytable
USING GIN (INT4RANGE(val, '[]')); // error, as is GIN(val)
我想到了以下几点:
CREATE OPERATOR CLASS gin_int4range_ops
DEFAULT FOR TYPE int4range[] USING gin AS
OPERATOR 1 <(anyrange,anyrange),
OPERATOR 2 <=(anyrange,anyrange),
OPERATOR 3 =(anyrange,anyrange),
OPERATOR 4 >=(anyrange,anyrange),
OPERATOR 5 >(anyrange,anyrange),
FUNCTION 1 lower(anyrange),
FUNCTION 2 upper(anyrange),
FUNCTION 3 isempty(anyrange),
FUNCTION 4 lower_inc(anyrange),
FUNCTION 5 upper_inc(anyrange);
但是当我试图创建索引时,它失败了(下面的错误)。但是,如果我从DO$$块中调用create,它将执行。
如果执行了create索引,则在INSERT INTO时会出现错误。
“错误:类型1的缓存查找失败”
我也试过:
OPERATOR 1 &&(anyrange,anyrange),
OPERATOR 2 <@(anyrange,anyrange),
OPERATOR 3 @>(anyrange,anyrange),
OPERATOR 4 =(anyrange,anyrange),
为了解决这个问题,我重新启动了PG,机器,并清空了数据库。我认为CREATE运算符代码中有错误。
如果我能索引一个自定义类型的数组(int,int4range),那就更好了。
我花了相当长的时间(一整天)浏览文档、论坛等,但找不到真正有助于我理解如何解决这个问题的任何东西(即创建一个工作自定义操作员类)。
最佳答案
您需要根据Range Functions and Operators来CREATE OPERATOR CLASS
,例如:
CREATE OPERATOR CLASS gin_int4range_ops
DEFAULT FOR TYPE int4range[] USING gin AS
OPERATOR 1 =(anyrange,anyrange),
FUNCTION 1 lower(anyrange),
FUNCTION 2 upper(anyrange),
FUNCTION 3 isempty(anyrange),
FUNCTION 4 lower_inc(anyrange),
FUNCTION 5 upper_inc(anyrange);
现在您可以:
CREATE INDEX ix_mytable4_vhstore_low
ON mytable USING gin (val gin_int4range_ops);
同时检查:
Operator Classes and Operator Families
CREATE OPERATOR CLASS
以下查询显示所有定义的运算符类:
SELECT am.amname AS index_method,
opc.opcname AS opclass_name
FROM pg_am am, pg_opclass opc
WHERE opc.opcmethod = am.oid
ORDER BY index_method, opclass_name;
此查询显示所有定义的运算符族以及每个族中包含的所有运算符:
SELECT am.amname AS index_method,
opf.opfname AS opfamily_name,
amop.amopopr::regoperator AS opfamily_operator
FROM pg_am am, pg_opfamily opf, pg_amop amop
WHERE opf.opfmethod = am.oid AND
amop.amopfamily = opf.oid
ORDER BY index_method, opfamily_name, opfamily_operator;
关于postgresql - 使用GIN的int4range的PostgreSQL索引数组-自定义运算符类,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17917252/