【问题标题】:postgresql full text search function syntaxpostgresql全文搜索函数语法
【发布时间】:2013-07-25 03:24:03
【问题描述】:

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

【问题讨论】:

  • ts_match_vq(to_tsvector('english', column1) @@ to_tsquery('searchedText')) 这对我不起作用。该函数被定义为期望一个 ts_vector 和一个 ts_query。在您的示例中,您正在向它传递一个布尔值,我的 9.1 对此抱怨。
  • 抱歉,已更正问题。而不是 ts_match_vq(to_tsvector('english', column1) @@ to_tsquery('searchedText')) 我想问 to_tsvector('english', column1) @@ to_tsquery('searchedText' )

标签: postgresql indexing full-text-search


【解决方案1】:

猜测:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-03
    • 1970-01-01
    • 2016-06-18
    • 2013-03-09
    • 2020-03-07
    相关资源
    最近更新 更多