PostgreSQL GIN pg_trgm 默认操作符类

Car*_*ker 6 postgresql index

我正在将 GIN 索引与pg_trgm用于索引varchar字段的模块一起使用。所以,要定义一个索引,我必须这样写:

CREATE INDEX gin_field_idx ON table_name USING gin (field gin_trgm_ops);
Run Code Online (Sandbox Code Playgroud)

如果我排除运算符类 ( git_trgm_ops) 并写入:

CREATE INDEX gin_field_idx ON table_name USING gin (field);
Run Code Online (Sandbox Code Playgroud)

PostgreSQL 将引发错误:

错误: 数据类型字符变体没有用于访问方法“gin”的默认运算符类
提示: 您必须为索引指定运算符类或为数据类型定义默认运算符类。

如何从模块定义默认操作符方法?

没有帮助。它描述了如何从扩展运算符和函数定义新的运算符类。但我必须从模块中定义默认操作符类。

任何帮助将不胜感激 :-)。

小智 6

您可以更新 pg_opclass 表并设置默认值。

update pg_opclass set opcdefault = true where opcname='gin_trgm_ops'
Run Code Online (Sandbox Code Playgroud)

默认情况下 pg_trgm 不会这样做,因为您可能拥有/想要不同的 GIN 默认值。

select * from pg_opclass where opcname = 'gin_trgm_ops';
Run Code Online (Sandbox Code Playgroud)

比您可以创建索引:

create index ON table USING gin (field); -- it will use the new default
Run Code Online (Sandbox Code Playgroud)

  • 让我添加一个小建议:手动更改系统目录可能会导致意外行为。此解决方案一直有效,直到默认操作符类没有冲突:如果另一个扩展将其设置为类型“文本”的默认值,则此更改将导致冲突。 (2认同)