Postgres全文搜索自定义tsvector转换

时间:2015-11-20 04:07:02

标签: postgresql

我想基于id(1-111.1x)和我的行的名称字段构建一个tsvector,所有这些都来自触发器和 tsvector_update_trigger(tsv,' pg_catalog.german' ,id,name)

但我的身份最终被切断了,就像' -111.1'而不是' 1-111.1x'。

有没有办法自定义转换,以便保留id字段(或应用某些操作,如lower()),同时名称字段被正确转换?

像这样的东西(由于setweight需要一个tsvector,它不起作用)?

CREATE FUNCTION tsv_trigger() RETURNS trigger AS $$
begin
  new.tsv :=
     setweight(new.id, 'A') ||
     setweight(to_tsvector('pg_catalog.german', coalesce(new.name,'')), 'D');
  return new;
end
$$ LANGUAGE plpgsql;

CREATE TRIGGER TS_tsv
  BEFORE INSERT OR UPDATE ON "model"
FOR EACH ROW EXECUTE PROCEDURE
  tsv_trigger();

谢谢!

1 个答案:

答案 0 :(得分:0)

我最终创建了另一个字段' _id',这是对' id'的标准化代表。 (因此,而不是' 1-111' - >' 1111')。然后必须删除搜索输入' - ','。',用空字符串替换它们。

当然我们需要小心,因为有时剥离某些字符可能不合适;我创建了一个正则表达式模式,只在匹配的ID中删除它们,但不在文本中删除。

就我而言,这似乎是一个可行的解决方案,尽管它只是一种解决方法。我很乐意提出真正的解决方案。