我跟随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
答案 0 :(得分:14)
@@
用于将tsvector
与tsquery
进行比较。您正在尝试将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)