PostgreSQL使用数组进行全文搜索

时间:2016-08-26 21:29:41

标签: arrays postgresql sqlalchemy full-text-search

我想在我的应用程序中实现全文搜索,但是我遇到了与我的Array类型列相关的一些障碍。如何实现一个psql触发器,以便我的"对象"表被更新,其数组列的每个元素(它们都是字符串)被添加到我的"搜索"的tsvector列中。表

1 个答案:

答案 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())组合不同。

没有位置编号和小写标准化,因此您可以获得意外结果。