9

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

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

我有两种方法可以做到这一点:

  1. 在 posts 表中创建一个 tsvector 列,触发对其的更新。
  2. 使用包含索引数据的 post_id 和 tsvector 列创建第二个表 (posts_search)。
  3. 创建一个简单的杜松子酒索引...(不可能,因为我的现实世界问题需要多个表中的数据作为索引)

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

将 tsvector 列与数据保持在同一个表中(副作用选择 * 现在很糟糕)还是单独的表(副作用,需要连接,索引过滤很复杂)是更好的方法吗?

4

1 回答 1

9

在我的实验中, tsvector 列的典型大小大约1%是该 tsvector 使用to_tsvector().

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

换句话说,我倾向于将 tsvector 字段卸载到单独的表的第二种解决方案。或者,或者,将帖子(原始文本)卸载到您的表格层次结构中(但我想这几乎是同一件事)。

请注意,要使全文搜索起作用,原始文本不是必需的。您甚至不想将它存储在数据库中,或者以高度压缩的格式存储它(并且不一定很容易被 SQL 例程访问)。只要有东西可以基于原始文本创建 tsvector,或者在它更改时更新,它就可以工作。

于 2013-01-21T01:06:49.360 回答