是否应该在同一个表或外部表中存储search_data tsvector?

Sam*_*ron 6 postgresql performance full-text-search

我正在postgres中实现全文搜索.

我想搜索我系统中的所有帖子.帖子全文索引是帖子标题和帖子正文的合并.

我有两种实现方法:

  1. 在posts表中创建一个tsvector列,触发对它的更新.
  2. 使用包含索引数据的post_id和tsvector列创建第二个表(posts_search).
  3. 创建一个简单的杜松子酒索引...(出于问题,导致我的真实世界问题需要索引的多个表中的数据)

考虑到我有时需要通过表中的其他属性(例如deleted_at is null,等等)过滤搜索,会有什么效果更好.

将tsvector列保留在与数据相同的表中(副作用select*now sucks)或单独的表(副作用,需要加入,索引过滤是否复杂)是一种更好的方法吗?

mvp*_*mvp 8

在我的实验中,tsvector列的典型大小约为1%此tsvector使用时计算的文本字段大小to_tsvector().

考虑到这一点,将tsvector列存储在另一个表中应该可以提供性能优势.例如,即使您不使用SELECT *(并且您不应该使用),原始单个表中的任何seqscan仍然必须加载包含原始文本的页面.如果将tsvector字段卸载到单独的表中,页面加载速度将提高100倍.

换句话说,我赞成卸载tsvector字段的第二个解决方案来分离表.或者,或者将帖子(原始文本)更深入地卸载到表层次结构中(但我想这几乎是一样的).

请注意,要使全文搜索起作用,原始文本不是必需的.您希望甚至不将其存储在数据库中,或者以高度压缩的格式存储它(并且不一定可以通过SQL例程轻松访问).只要某些内容可以根据原始文本创建tsvector,或者在更改时更新,它就会起作用.