这是我的架构
Column | Type
--------------------------+----------------------------
id | integer
title | character varying(255)
summary | character varying(255)
readable_content | text
created_at | timestamp without time zone
updated_at | timestamp without time zone
textsearchable_index_col | tsvector
Indexes:
"site_articles_pkey" PRIMARY KEY, btree (id)
"index_site_articles_on_textsearchable_index_col" gin (textsearchable_index_col)
Triggers:
site_articles_before_insert_update_row_tr BEFORE INSERT OR UPDATE ON site_articles FOR EACH ROW EXECUTE PROCEDURE site_articles_before_insert_update_row_tr()
这是触发器功能:
CREATE FUNCTION site_articles_before_insert_update_row_tr() RETURNS trigger
LANGUAGE plpgsql
AS $$
BEGIN
new.tsv := tsvector_update_trigger(textsearchable_index_col, 'pg_catalog.simple', title, summary, readable_content);
new.tsv := setweight(to_tsvector('pg_catalog.simple', coalesce(new.title,'')), 'A') ||
setweight(to_tsvector('pg_catalog.simple', coalesce(new.summary,'')), 'B') ||
setweight(to_tsvector('pg_catalog.simple', coalesce(new.readable_content,'')), 'C');
RETURN NEW;
END;
$$;
但是,当我更新这样的记录时:
UPDATE "site_articles" SET "updated_at" = '2013-12-13 05:43:59.802580' WHERE "site_articles"."id" = 1
我得到了
ERROR: column "textsearchable_index_col" does not exist
LINE 1: SELECT tsvector_update_trigger(textsearchable_index_col, 'pg...
^
QUERY: SELECT tsvector_update_trigger(textsearchable_index_col, 'pg_catalog.simple', title, summary, readable_content)
我很确定列名是正确的。不确定是否重要,我在添加tsvector列之后连接了这样的行(我正在使用Rails迁移)
def up
add_column :site_articles, :textsearchable_index_col, :tsvector
sql = <<-SQL
UPDATE site_articles SET textsearchable_index_col =
to_tsvector('simple', coalesce("site_articles"."title"::text,'')
|| ' ' || coalesce("site_articles"."summary"::text, '')
|| ' ' || coalesce("site_articles"."readable_content"::text, '')
);
SQL
execute sql
add_index :site_articles, :textsearchable_index_col, using: 'gin'
end
我是否遗漏了某些内容,或者每列都应该有自己的tsvector列(没有连接在一起)?
答案 0 :(得分:0)
事实上。它应该是new.textsearchable_index_col
。后续字段也是如此。
(顺便说一下,分配tsv两次没什么意义。要么使用你的第一个(更正的)语句,要么使用你的第二个。但不是两个,因为第二个会覆盖第一个,而tsv的计算成本很高。)