0bs*_*r07 7 postgresql ruby-on-rails tsvector rails-postgresql pg-search
我正在使用Rails在Rails应用程序中创建搜索pg_search gem
.但是,其中一个表有一个Text
数据类型字段,它的内容恰好比平时略大.
现在,当我需要tsvector column
为text
列设置a时,由于文本字段大小与tsvector大小的原因,我面临一些限制.
ERROR: string is too long for tsvector (5068741 bytes, max 1048575 bytes)
Text
在SQL
触发器中创建tsvector列时,是否有任何方法可以确定跳过较大字段的条件以执行以下操作:
伪代码:
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()")
Run Code Online (Sandbox Code Playgroud)
我找不到答案的相关问题:
一个简单的解决方法是仅to_tsvector()
使用截断的文本值进行调用。例如,使用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();
Run Code Online (Sandbox Code Playgroud)
这会将文档的内容截断为 4 MiB,这对于许多文档集合来说应该足够有用了。而不是仅仅忽略“过长”的文档,您至少要包含其中的一部分。根据我的经验,4 MiB 适用于技术英语文档。根据实际使用的词汇量的大小,您甚至可以在截断更大的值(如 10 MiB)时取得成功。
如果你真的想忽略太长的文档,你可以to_tsvector()
用这样的 if 语句来保护赋值:
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;
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
457 次 |
最近记录: |