具有多列的 Postgres 全文搜索,为什么在索引中而不是在运行时连接?

lat*_*lip 4 postgresql indexing search

最近几天我在 postgres 中遇到了全文搜索,在跨多列搜索时我对索引有点困惑。

postgres文档讨论了ts_vector在连接列上创建索引,如下所示:

CREATE INDEX pgweb_idx ON pgweb 
    USING gin(to_tsvector('english', title || ' ' || body));
Run Code Online (Sandbox Code Playgroud)

我可以这样搜索:

... WHERE 
      (to_tsvector('english', title||' '||body) @@ to_tsquery('english', 'foo'))
Run Code Online (Sandbox Code Playgroud)

但是,如果我想有时只搜索标题,有时只搜索正文,有时两者都搜索,我将需要 3 个单独的索引。如果我添加了第三列,那可能是 6 个索引,依此类推。

我在文档中没有看到的另一种方法是单独索引两列,然后只使用普通WHERE...AND查询:

... WHERE
      (to_tsvector('english', title) @@ to_tsquery('english','foo'))
    AND
      (to_tsvector('english', body) @@ to_tsquery('english','foo'))
Run Code Online (Sandbox Code Playgroud)

在大约 100 万行上对两者进行基准测试似乎在性能上基本上没有差异。

所以我的问题是:

为什么我要像这样连接索引,而不是单独索引列?两者的优点/缺点是什么?

我最好的猜测是,如果我事先知道我只想搜索两列(一次从不搜索),我将只需要通过连接使用较少内存的一个索引。


编辑

移至:https : //dba.stackexchange.com/questions/15412/postgres-full-text-search-with-multiple-columns-why-concat-in-index-and-not-at

小智 5

  1. 对数据库使用一个索引更容易/更快;
  2. 使用两个索引时,很难对结果进行正确排序;
  3. 您可以在创建单个索引时为列分配相对权重,以便匹配 intitle比匹配 in 更有价值body
  4. 您在此处搜索单个单词,如果您搜索多个单词并且它们分别出现在不同的列中,会发生什么情况?

  • #3 真的很有趣——但我不知道如何做到这一点,也不知道在哪里可以找到——你能提供一个参考或例子吗? (6认同)
  • 仍然有人想了解更多关于 #3 的信息:) (3认同)