抱歉问了这个基本问题。
我有一个包含以下列的表格。
Column | Type | Modifiers
--------+---------+-----------
id | integer |
doc_id | bigint |
text | text |
我只想要包含“其他事件”一词的观察结果
SELECT * FROM eightks\d
WHERE to_tsvector(text) @@ to_tsquery('other_events')
我知道 ts_vector 的长度是有限制的。
错误信息
ERROR: string is too long for tsvector (2368732 bytes, max 1048575 bytes)
如何将文本列转换为 ts_vector,这会解决我的大小限制问题吗?或者,如何排除超过最大大小的观察结果?
Postgres 版本 9.3.5.0
这里是极限参考极限
谢谢
解决
ts_vector
大小限制的一种方法是将 text
列中的文档拆分为更小的块以进行搜索,然后合并这些片段。打破列后,您可以将块存储到单独的行或列中。
解决
ts_vector
大小限制的另一种方法是使用截断的文本值调用 to_tsvector()
。这可以通过创建一个触发器函数来实现,该函数将 ts_vector
列设置为截断的文本值。
CREATE FUNCTION tsv_trigger_fn() RETURNS
trigger AS $$
begin
new.tsv_text := to_tsvector('english', left(new.text, 1*1024*1024));
return new;
end
$$ LANGUAGE plpgsql;
CREATE TRIGGER tsv_trigger BEFORE INSERT OR UPDATE
ON <your_table> FOR EACH ROW EXECUTE FUNCTION tsv_trigger_fn();
按点分割文本 = 句子边界,并使用 unnest() 创建多行以仅在一个句子中执行每个搜索:
select /*distinct*/ id, text, /* questions result up to here, but with distinct */
text_chunk, /* debug text chunks */
to_tsvector(text_chunk) @@ to_tsquery('unneccessary_events') as search_hit_unneccessary, /* debug search1 */
to_tsvector(text_chunk) @@ to_tsquery('other_events') as search_hit_other /* debug search2 */
from
(select id, unnest(string_to_array(text,'.')) as text_chunk, text from
(select 1 as id,'unneccessary events. other events. more events. no events.' as text) eightks
) eightks_chunked
结果:“其他”(search2)是一个被忽略的搜索词,但我为“不必要的事件”添加了另一个 search1 ;-)
id|text |text_chunk |search_hit_unneccessary|search_hit_other|
--+----------------------------------------------------------+-------------------+-----------------------+----------------+
1|unneccessary events. other events. more events. no events.|unneccessary events|true |true |
1|unneccessary events. other events. more events. no events.| other events |false |true |
1|unneccessary events. other events. more events. no events.| more events |false |true |
1|unneccessary events. other events. more events. no events.| no events |false |true |
1|unneccessary events. other events. more events. no events.| |false |false |