gpt4 book ai didi

ruby-on-rails - PostgreSQL:如何解决 ts_vector 大小限制?

转载 作者:行者123 更新时间:2023-11-29 11:22:27 25 4
gpt4 key购买 nike

我正在使用 pg_search gem 在 Rails 应用程序中创建搜索。但是,其中一个表有一个 Text 数据类型字段,它的内容恰好比平时大一点。

现在,当我需要为 text 列设置一个 tsvector 列 时,由于文本字段大小与 tsvector 大小,我面临一些限制。

错误:字符串对于 tsvector 来说太长(5068741 字节,最大 1048575 字节)

SQL 触发器中创建 tsvector 列以执行如下操作时,有什么方法可以确定跳过更大的 Text 字段的条件:

伪代码:

execute(<<-TRIGGERSQL)
CREATE OR REPLACE FUNCTION public.essays_before_insert_update_row_tr()
RETURNS trigger
LANGUAGE plpgsql
AS $function$
BEGIN
If (SELECT LEN(body_text) FROM essays) <= 1048575
new.tsv_body_text := to_tsvector('pg_catalog.english', coalesce(new.body_text,''));
RETURN NEW;
End
END;
$function$
TRIGGERSQL

# no candidate create_trigger statement could be found, creating an adapter-specific one
execute("CREATE TRIGGER essays_before_insert_update_row_tr BEFORE INSERT OR UPDATE ON \"essays\" FOR EACH ROW EXECUTE PROCEDURE essays_before_insert_update_row_tr()")

我发现没有答案的相关问题:

Postgresql - converting text to ts_vector

最佳答案

一个简单的解决方法是使用截断的文本值调用 to_tsvector()。例如,使用 trigger example以 Postgres 手册为起点,这种方法如下所示:

CREATE FUNCTION essays_tsv_trigger_fn() RETURNS trigger AS $$
begin
new.tsv_body_text := to_tsvector('english', left(new.body_text, 4*1024*1024));
return new;
end
$$ LANGUAGE plpgsql;

CREATE TRIGGER essays_tsv_trigger BEFORE INSERT OR UPDATE
ON essays FOR EACH ROW EXECUTE FUNCTION essays_tsv_trigger_fn();

这会将文档的内容截断为 4 MiB,这对于许多文档集合来说应该足够有用了。与其忽略“过长”的文档,不如至少包含其中的一部分。根据我的经验,4 MiB 适用于技术英语文档。根据实际使用的词汇量的大小,您甚至可以在使用更大的值(如 10 MiB)进行截断时成功。

如果您真的想忽略太长的文档,您可以使用如下 if 语句保护 to_tsvector() 赋值:

CREATE FUNCTION essays_tsv_trigger_fn() RETURNS trigger AS $$
begin
if length(new.body_text) <= 4*1024*1024 then
new.tsv_body_text := to_tsvector('english', new.body_text);
end if;
return new;
end
$$ LANGUAGE plpgsql;

关于ruby-on-rails - PostgreSQL:如何解决 ts_vector 大小限制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30470151/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com