如何重新创建最初由 tsvector_update_trigger 填充的 tsvector 列
How to recreate tsvector column originally populated by tsvector_update_trigger
我是 运行 Postgres 9.4.
我有一个名为 main_search_index_col 的列,它由这个触发器填充:
main_vector_update BEFORE INSERT OR UPDATE ON the_entries
FOR EACH ROW EXECUTE PROCEDURE
svector_update_trigger('main_search_index_col','pg_catalog.english', 'name', 'location', 'type')
我已经创建了一个名为 unaccent_english (public.unaccent_english) 的新文本搜索配置来替换 pg_catalog.english
我放弃了上面的触发器,并使用 public.unaccent_english 而不是 pg_catalog.english
重做了它
在 the_entries 上触发 main_vector_update;
CREATE TRIGGER main_vector_update BEFORE INSERT OR UPDATE ON the_entries
FOR EACH ROW EXECUTE PROCEDURE
tsvector_update_trigger('main_search_index_col','public.unaccent_english', 'name', 'location', 'type');
但据我了解,除非更新行或添加新行,否则不会更改 main_search_index_col 中的任何值。
我想遍历并为每一行更新 main_search_index_col,或者删除该列并完全重新创建它并填充它,就好像它的新形式的触发器一直存在一样。
如何使 main_search_index_col 列的内容对新触发器正确?
另外,如何查看 tsvector_update_trigger 的确切定义?我有一种感觉,如果我能阅读它的定义,它可能有助于制定我自己的解决方案。
您可以在src/backend/utils/adt/tsvector_op.c
中找到tsvector_update_trigger
的定义。
您可以更新 table 以匹配新的触发器定义,如下所示:
UPDATE the_entries
SET main_search_index_col =
to_tsvector(
'public.unaccent_english', name || ' ' || location || ' ' || type
);
但你也可以使用触发器并这样做:
UPDATE the_entries SET name = name;
这不需要触发函数定义的内部知识,它也会重写整个table。
在这样的 UPDATE
之后,您可能想在 table 上发布免费的 space 和
VACUUM (FULL, ANALYZE) the_entries;
注意:对于最近的 PostgreSQL 版本,生成的列比触发器填充的列更简单、更好。
我是 运行 Postgres 9.4.
我有一个名为 main_search_index_col 的列,它由这个触发器填充:
main_vector_update BEFORE INSERT OR UPDATE ON the_entries
FOR EACH ROW EXECUTE PROCEDURE
svector_update_trigger('main_search_index_col','pg_catalog.english', 'name', 'location', 'type')
我已经创建了一个名为 unaccent_english (public.unaccent_english) 的新文本搜索配置来替换 pg_catalog.english
我放弃了上面的触发器,并使用 public.unaccent_english 而不是 pg_catalog.english
重做了它在 the_entries 上触发 main_vector_update;
CREATE TRIGGER main_vector_update BEFORE INSERT OR UPDATE ON the_entries
FOR EACH ROW EXECUTE PROCEDURE
tsvector_update_trigger('main_search_index_col','public.unaccent_english', 'name', 'location', 'type');
但据我了解,除非更新行或添加新行,否则不会更改 main_search_index_col 中的任何值。
我想遍历并为每一行更新 main_search_index_col,或者删除该列并完全重新创建它并填充它,就好像它的新形式的触发器一直存在一样。
如何使 main_search_index_col 列的内容对新触发器正确?
另外,如何查看 tsvector_update_trigger 的确切定义?我有一种感觉,如果我能阅读它的定义,它可能有助于制定我自己的解决方案。
您可以在src/backend/utils/adt/tsvector_op.c
中找到tsvector_update_trigger
的定义。
您可以更新 table 以匹配新的触发器定义,如下所示:
UPDATE the_entries
SET main_search_index_col =
to_tsvector(
'public.unaccent_english', name || ' ' || location || ' ' || type
);
但你也可以使用触发器并这样做:
UPDATE the_entries SET name = name;
这不需要触发函数定义的内部知识,它也会重写整个table。
在这样的 UPDATE
之后,您可能想在 table 上发布免费的 space 和
VACUUM (FULL, ANALYZE) the_entries;
注意:对于最近的 PostgreSQL 版本,生成的列比触发器填充的列更简单、更好。