最近几天我在 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...OR
查询:
... WHERE
(to_tsvector('english', title) @@ to_tsquery('english','foo'))
OR
(to_tsvector('english', body) @@ to_tsquery('english','foo'))
Run Code Online (Sandbox Code Playgroud)
在大约 100 万行上对两者进行基准测试似乎在性能上基本上没有差异。
所以我的问题是:
为什么我要像这样连接索引,而不是单独索引列?两者的优点/缺点是什么?
我最好的猜测是,如果我事先知道我只想搜索两列(一次从不搜索),我将只需要通过连接使用较少内存的一个索引。