在过去的几天里,我在postgres中遇到了全文搜索,并且在跨多列搜索时对索引有些困惑。
postgres 文档讨论了如何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...OR
查询:
... WHERE
(to_tsvector('english', title) @@ to_tsquery('english','foo'))
OR
(to_tsvector('english', body) @@ to_tsquery('english','foo'))
在大约一百万行中对这两个基准进行基准测试似乎在性能上基本没有区别。
所以我的问题是:
为什么我要连接这样的索引,而不是单独索引列?两者的优点/缺点是什么?
我最好的猜测是,如果我事先知道,我只想搜索两个列(一次不搜索),那么我只需要通过串联使用较少内存的一个索引。
你的猜测是正确的。如果没有其他人这样做,我鼓励您进行自我回答,这里是危险的风格。
—
jcolebrand
title
到body
索引然后再给出很多价值。我可能只会坚持单独索引它们。另外,如果一次过古怪地以某种方式要求您进行连接,那么我想您可以临时运行查询。