在postgres数据库中,我们有一个表table1和列column1,其类型是文本。 我们为该列创建了一个索引 CREATE INDEX idx_column1 ON table1使用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'))
答案 0 :(得分: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
永远不会在文档中提及,你应该总是使用@@
,因为它负责调用正确的函数以及随之而来的所有东西。