在 postgres 数据库中,我们有一个表 table1 和列 column1,类型是文本。 我们为该列创建了一个索引 使用 gin (to_tsvector('english', column1)) 在 table1 上创建索引 idx_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'))
最佳答案
大胆的猜测:
向量@@查询
定义为
CREATE OPERATOR @@(
PROCEDURE = ts_match_vq,
LEFTARG = tsvector,
RIGHTARG = tsquery,
COMMUTATOR = @@,
RESTRICT = tsmatchsel,
JOIN = tsmatchjoinsel);
查看tsmatchjoinsel
发生了很多事情(不要问我什么,这种 C 语言远远超出了我的范围......)但是如果你遍历不同的函数,就会涉及一些计算。当直接使用 ts_match_vq
时,您可以绕过这些计算。这就是文档中从未提及 ts_match_vq
的原因,您应该始终使用 @@
,因为它负责调用正确的函数以及随之而来的所有内容。
关于postgresql 全文搜索函数语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17854556/