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



我跟随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

@@用于比较tsvectortsquery。您正在尝试将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;

相关内容

最新更新