12

我正在跟随 Ryan Bates 的 Railscast 使用 Postgres 进行全文搜索,但是,他使用的是 postgres 9.1,而我使用的是 9.2。他构建以下查询来执行搜索。如果我的查询是一个词,例如“超人”,它适用于我,但如果它是两个词,例如dc comics,或super 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
4

1 回答 1

27

@@用于比较 atsvector和 a tsquery。您正在尝试将 atsvector与无效的tsquery.

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

'super man'是类型text,应该真正包含在对 . 的调用中to_tsquery()。Postgres未能将其强制转换为 tsquery,因为 to_tsquery('super man')不是有效查询。一个有效的 tsquery 必须有布尔运算符,比如&or|来告诉查询如何处理这些单词。'super & man' 可能会起作用。

为了让您不必为 AND 样式查询的简单情况编写查询,plainto_tsquery这会更容易一些。在您的情况下,将您的参数包装:q在调用中plainto_tsquery

plainto_tsquery(:q)
于 2013-05-09T15:59:12.220 回答