Here's my schema
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()
and here's the trigger function:
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;
$$;
However, when I update a record like this:
UPDATE "site_articles" SET "updated_at" = '2013-12-13 05:43:59.802580' WHERE "site_articles"."id" = 1
I get
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)
I'm pretty sure the column name is correct. Not sure if it matters, I concatenate the rows like this after I added the tsvector column (I'm using Rails migration)
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
Did I miss something or each column should have its own tsvector column (not concatenated in one)?