如何使用gin在PostgreSQL中对非字符类型数据创建tsvector_update_触发器?
如何使用gin在PostgreSQL的非字符数据类型上创建tsvector更新触发器以支持全文搜索 例如,有一个如何使用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_
posts
表的情况,该表具有:
(varchar)标题
(varchar)text
(枚举['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();