如何使用gin在PostgreSQL中对非字符类型数据创建tsvector_update_触发器?

如何使用gin在PostgreSQL中对非字符类型数据创建tsvector_update_触发器?,postgresql,full-text-search,Postgresql,Full Text Search,如何使用gin在PostgreSQL的非字符数据类型上创建tsvector更新触发器以支持全文搜索 例如,有一个posts表的情况,该表具有: 标题(varchar) text(varchar) 状态(枚举['published','draft'] 喜欢(整数) 我已经创建了一个索引列: ALTER TABLE "posts" ADD COLUMN "posts_full_text" TSVECTOR'; UPDATE "posts" SET "posts_full_text" = to_

如何使用gin在PostgreSQL的非字符数据类型上创建tsvector更新触发器以支持全文搜索

例如,有一个
posts
表的情况,该表具有:

  • 标题
    (varchar)
  • text
    (varchar)
  • 状态
    (枚举['published','draft']
  • 喜欢
    (整数)
我已经创建了一个索引列:

ALTER TABLE "posts" ADD COLUMN "posts_full_text" TSVECTOR';

UPDATE "posts" SET "posts_full_text" = to_tsvector('english', title || ' ' || text || ' ' || status || ' ' || likes);

CREATE INDEX np_search_idx ON "posts" USING gin("posts_full_text");
然后尝试创建要更新的触发器:

CREATE TRIGGER update_posts_tsvector BEFORE INSERT OR UPDATE 
ON posts FOR EACH ROW EXECUTE PROCEDURE 
tsvector_update_trigger("posts", 'pg_catalog.english', title, text, status, likes);
上面的语句抛出一个错误,指出
status
likes
列是非字符类型

尝试强制转换无效,也不会抛出表示方法签名不匹配的错误:

CREATE TRIGGER update_posts_tsvector BEFORE INSERT OR UPDATE 
ON posts FOR EACH ROW EXECUTE PROCEDURE 
tsvector_update_trigger("posts", 'pg_catalog.english', title, text, status::VARCHAR, likes::VARCHAR);

因此,在实现强制转换策略之前,通过这种方法不可能索引非字符变量列。

实现这一点的方法是创建一个存储函数,我们可以在其中强制转换,然后将其传递给
to_tsvector()
,而不是
tsvector_update_trigger()

(我们可以省略
setweight
wrapping方法,直接使用
to_tsvector

然后将该函数绑定到更新触发器:

CREATE TRIGGER np_vector_update BEFORE INSERT OR UPDATE ON "posts" FOR EACH ROW EXECUTE PROCEDURE update_posts_tsvector();
希望这将是有用的人

CREATE TRIGGER np_vector_update BEFORE INSERT OR UPDATE ON "posts" FOR EACH ROW EXECUTE PROCEDURE update_posts_tsvector();