我跟随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
query from 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
@@
用于比较tsvector
和tsquery
。您正在尝试将tsvector
与不合法的tsquery
进行比较。
'superman'
是text
类型的,实际上应该包装在对to_tsquery()
的调用中。然而,看起来postgres已经试图帮助你,并强迫它为你变成一个查询,to_tsquery('superman')是一个有效的查询。
'super man'
是text
类型的,实际上应该包装在对to_tsquery()
的调用中。由于to_tsquery('super man')是而不是一个有效的查询,所以Postgres 无法将强制转换为tsquery。一个有效的查询必须有像&
或|
这样的布尔运算符来告诉查询如何处理单词。"超级,"Man"可能会起作用。
为了使您不必为简单的and样式查询编写查询,plainto_tsquery
使这更容易一些。在这种情况下,将:q
参数封装在对plainto_tsquery
的调用中
plainto_tsquery(:q)
如果您希望您的查询有多个单词,但您的Postgres DB在查询不完整时仍然返回结果,请使用以下命令:
SELECT * FROM <TABLE_NAME> where <TSVECTOR_COLUMN> @@ (phraseto_tsquery('incomplete wo')::text || ':*')::tsquery = true;