【发布时间】:2018-08-19 17:53:03
【问题描述】:
如何在 PostgreSQL 中使用 gin 为非字符数据类型创建 tsvector 更新触发器以支持全文搜索?
例如,posts 表的情况:
-
title(varchar) -
text(varchar) -
status(枚举['已发布','草稿'] -
likes(整数)
我已经创建了一个索引列:
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);
因此,在实现强制转换策略之前,通过这种方式是不可能索引非 char 变体列的。
【问题讨论】:
标签: postgresql full-text-search