3

在 postgres 数据库中,我们有一个表 table1 和列 column1 ,其类型是文本。我们为该列创建了一个索引 CREATE INDEX idx_column1 ON table1 USING gin (to_tsvector('english', column1));

问题是,为什么当我们执行这个查询

SELECT *
FROM table1
where to_tsvector('english', column1) @@ to_tsquery('searchedText')

使用了索引,但是这个查询没有使用索引

SELECT *
FROM table1
where ts_match_vq(to_tsvector('english', column1),to_tsquery('searchedText'))
4

1 回答 1

2

胡乱猜测:

vector @@ query定义为

CREATE OPERATOR @@(
  PROCEDURE = ts_match_vq,
  LEFTARG = tsvector,
  RIGHTARG = tsquery,
  COMMUTATOR = @@,
  RESTRICT = tsmatchsel,
  JOIN = tsmatchjoinsel);

看看tsmatchjoinsel发生了很多事情(不要问我什么,这种 C 超出了我的范围......)但是如果你通过不同的函数,就会涉及到一些计算。直接使用时 ts_match_vq,您绕过这些计算。这就是为什么ts_match_vq在文档中从未提及并且您应该始终使用它的原因@@,因为它负责调用正确的函数以及与之相关的所有内容。

于 2013-07-25T12:09:31.307 回答