我想在我的应用程序中实现全文搜索,但是我遇到了与我的Array类型列相关的一些障碍。如何实现一个psql触发器,以便我的"对象"表被更新,其数组列的每个元素(它们都是字符串)被添加到我的"搜索"的tsvector列中。表
答案 0 :(得分:0)
在Postgres 9.6 array_to_tsvector was added中。
如果你正在处理同一个表,你可以这样写。
CREATE FUNCTION tsv_trigger() RETURNS trigger AS $$
begin
IF (TG_OP = 'INSERT') OR old.array_column <> new.array_column THEN
new.tsv := array_to_tsvector( new.array_column);
END IF;
return new;
end
$$ LANGUAGE plpgsql;
CREATE TRIGGER tsvectorupdate BEFORE INSERT OR UPDATE
ON my_table FOR EACH ROW EXECUTE PROCEDURE tsv_trigger();
如果您正在处理两个表,而不是您需要编写更新
CREATE FUNCTION cross_tables_tsv_trigger() RETURNS trigger AS $$
begin
IF (TG_OP = 'INSERT') OR old.array_column <> new.array_column THEN
UPDATE search_table st
SET tsv = array_to_tsvector( new.array_column )
WHERE st.id = new.searchable_record_id
END IF;
# you can't return NULL because you'll break the chain
return new;
end
$$ LANGUAGE plpgsql;
请注意它与默认的to_tsvector(array_to_string())组合不同。
没有位置编号和小写标准化,因此您可以获得意外结果。