gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 11:43:51 27 4
gpt4 key购买 nike

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

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

CREATE INDEX pgweb_idx ON pgweb 
USING gin(to_tsvector('english', title || ' ' || body));

我可以这样搜索:

... WHERE 
(to_tsvector('english', title||' '||body) @@ to_tsquery('english', 'foo'))

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

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

... WHERE
(to_tsvector('english', title) @@ to_tsquery('english','foo'))
AND
(to_tsvector('english', body) @@ to_tsquery('english','foo'))

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

所以我的问题是:

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

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


编辑

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

最佳答案

  1. 使用一个索引对于数据库来说更容易/更快;
  2. 使用两个索引时,很难对结果进行正确排序;
  3. 您可以在创建单个索引时为列分配相对权重,这样 title 中的匹配将比 body 中的匹配更有值(value);
  4. 您在这里搜索单个词,如果您搜索多个词并且它们分别出现在不同的列中会怎样?

关于postgresql - 具有多列的 Postgres 全文搜索,为什么在索引中而不是在运行时连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9813887/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com