在 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'))

最佳答案

胡乱猜测:
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 的原因,您应该始终使用 @@,因为它负责调用正确的函数以及与之相关的所有内容。

关于postgresql全文搜索函数语法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17854556/

10-15 18:23