Postgresql - 将文本转换为 ts_vector

问题描述 投票:0回答:2

抱歉问了这个基本问题。

我有一个包含以下列的表格。

      Column |  Type   | Modifiers 
     --------+---------+-----------
      id     | integer | 
      doc_id | bigint  | 
      text   | text    | 
  • 我正在尝试对“文本”(第三列)进行文本匹配
  • 当我尝试在文本列上进行文本匹配时,我收到一条错误消息。说字符串对于 ts_vector 来说太长了。

我只想要包含“其他事件”一词的观察结果

    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

这里是极限参考极限

谢谢

postgresql textmatching
2个回答
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();

0
投票

按点分割文本 = 句子边界,并使用 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           |
© www.soinside.com 2019 - 2024. All rights reserved.