postgres搜索查询错误,如果使用空间

时间:2013-05-09 15:29:02

标签: ruby-on-rails postgresql

我跟随Ryan Bates的Railscast跟Postgres进行全文搜索,然而,他正在使用postgres 9.1而我正在使用9.2。他构建以下查询以执行搜索。如果我的查询是单个单词,例如“超人”,但如果它是两个单词,例如dc comicssuper man,它对我有用,我收到此错误,这只是新的postgres我无法弄清楚如何修复。你能帮忙吗?

PG::Error: ERROR:  syntax error in tsquery: "super man"
LINE 1: ...articles"  WHERE (to_tsvector('english', name) @@ 'super man...
                                                             ^
: SELECT  "articles".* FROM "articles"  WHERE (to_tsvector('english', name) @@ 'super man' or to_tsvector('english', content) @@ 'super man') ORDER BY       ts_rank(to_tsvector(name), plainto_tsquery('super man')) +
      ts_rank(to_tsvector(content), plainto_tsquery('super man'))
 desc LIMIT 3 OFFSET 0
来自Article.rb的

查询

 def self.text_search(query)
    if query.present?
      rank = <<-RANK
      ts_rank(to_tsvector(name), plainto_tsquery(#{sanitize(query)})) +
      ts_rank(to_tsvector(content), plainto_tsquery(#{sanitize(query)}))
    RANK

  where("to_tsvector('english', name) @@ :q or to_tsvector('english', content) @@ :q", q: query).order("#{rank} desc")

    else
      scoped
    end
  end

1 个答案:

答案 0 :(得分:14)

@@用于将tsvectortsquery进行比较。您正在尝试将tsvector与有效tsquery的内容进行比较。

'superman'属于text类型,应该真正包含在对to_tsquery()的调用中。然而,看起来postgres试图帮助你并将其强制为tsquery,而to_tsquery('superman')是一个有效的查询。

'super man'属于text类型,应该真正包含在对to_tsquery()的调用中。 Postgres已经失败将其强制为tsquery,因为to_tsquery('super man')是有效查询。有效的tsquery必须有&|等布尔运算符来告诉查询如何处理单词。 '超级&amp;男人'可能会工作。

为了节省您必须为AND样式查询的简单案例编写查询,plainto_tsquery使这更容易一些。在您的案例中,将:q参数包裹在plainto_tsquery

的电话中
plainto_tsquery(:q)