设置postgres ts_vector列

时间:2015-01-05 02:00:49

标签: postgresql sqlalchemy tsvector

我在postgres中有一个带有ts_vector列的搜索表。看起来当我将dstring插入此列时会对其进行矢量化,但它不会阻止或删除停用词:

test=# create table sample_ts_vec ( id varchar(255), tsv tsvector);
CREATE TABLE
test=# insert into sample_ts_vec values ('t1234', 'this is a test');
INSERT 0 1
test=# select * from sample_ts_vec;
  id   |          tsv           
-------+------------------------
 t1234 | 'a' 'is' 'test' 'this'
(1 row)

test=# insert into sample_ts_vec values ('t1235', to_tsvector('this is a test'));
INSERT 0 1
test=# select * from sample_ts_vec;
  id   |          tsv           
-------+------------------------
 t1234 | 'a' 'is' 'test' 'this'
 t1235 | 'test':4
(2 rows)

您会注意到,在第二个插入中,删除了3个停用词,并且该词被阻止(在这种情况下,不需要词干),而在第一个示例中,每个词都被添加。如何在插入之前将to_tsvector函数自动应用于字符串值?

2 个答案:

答案 0 :(得分:1)

您可以为TRIGGER创建ON UPDATE OR INSERT 假设表中有一个列数据,你想要打开一个tsv索引,就像这样

CREATE FUNCTION tsvfix() RETURNS TRIGGER LANGUAGE PLPGSQL AS $$
BEGIN
  NEW.tsv=to_tsvector(NEW.data);
  RETURN NEW;
END
$$;

CREATE TRIGER "tsvfix" ON UPDATE OR INSERT TO "sample_ts_vec" EXECUTE PROCEDURE tsvfix;

答案 1 :(得分:1)

Jasen的答案很接近,但它有一些重要的错误 - 这是更正后的版本:

CREATE FUNCTION tsvfix() RETURNS TRIGGER LANGUAGE PLPGSQL AS $$
BEGIN
  NEW.tsv=to_tsvector(NEW.tsv);
  RETURN NEW;
END
$$;

CREATE TRIGGER "tsvfix" BEFORE UPDATE OR INSERT ON "sample_ts_vec" FOR EACH ROW EXECUTE PROCEDURE tsvfix();

但即使这样也行不通。我收到错误ERROR: function to_tsvector(tsvector) does not exist