设置 postgres ts_vector 列
Setting up postgres ts_vector column
我在带有 ts_vector 列的 postgres 中搜索 table。看起来当我向该列插入一个 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 函数应用到字符串值?
您可以为 ON UPDATE OR INSERT
创建一个 TRIGGER
假设 table 有一个列数据,你想在上面建立 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;
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
我在带有 ts_vector 列的 postgres 中搜索 table。看起来当我向该列插入一个 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 函数应用到字符串值?
您可以为 ON UPDATE OR INSERT
创建一个 TRIGGER
假设 table 有一个列数据,你想在上面建立 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;
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