我正在尝试在 PostgreSQL 9.2 中设置全文搜索。我创建了一个新表来保存我想要搜索的内容(以便我可以搜索许多不同类型的项目),如下所示:
CREATE TABLE search (
target_id bigint PRIMARY KEY,
target_type text,
fts tsvector
);
CREATE INDEX search_fts ON search USING gin(fts);
每次将新项目插入(或更新)到我要搜索的各种表之一时,它都应该自动添加到search
表中。假设我的表如下所示:
CREATE TABLE item (id bigint PRIMARY KEY, name text NOT NULL, description text);
我创建了一个触发器,传入我希望能够搜索的列名:
CREATE TRIGGER insert_item_search BEFORE INSERT
ON item FOR EACH ROW EXECUTE PROCEDURE
insert_search('{name, description}'::text[]);
然后创建了一个新函数insert_search
:
CREATE OR REPLACE FUNCTION insert_search(cols text[]) RETURNS TRIGGER AS $$
BEGIN
INSERT INTO search (target_id, target_type, fts) VALUES (
NEW.id, TG_TABLE_NAME, to_tsvector('english', 'foo')
);
RETURN NEW;
END;
$$ LANGUAGE PLPGSQL;
我的问题是,如何根据cols
to传入表值to_tsvector
?现在,该函数被调用并正确插入id
and type
,但我不知道根据cols
参数动态获取其他值的正确方法。