12

私は、Postgres を使用した全文検索について Ryan Bates の Railscast に従っていますが、彼は postgres 9.1 を使用しており、私は 9.2 を使用しています。次のクエリを作成して検索を実行します。クエリが「スーパーマン」などの単一の単語である場合は機能しますが、dc comics、またはなどの 2 つの単語である場合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

@@を と比較するために使用されtsvectorますtsquerytsvectorを有効ではないものと比較しようとしていますtsquery

'superman'は型textであり、実際には への呼び出しでラップする必要がありますto_tsquery()。ただし、postgres があなたを助けようとして、それを tsquery に強制したようです。 to_tsquery('superman') は有効なクエリです。

'super man'は型textであり、実際には への呼び出しでラップする必要がありますto_tsquery()。to_tsquery('super man') は有効なクエリではないため、 Postgres は強制的に tsquery に変換できませんでした。有効な tsqueryには、単語の処理方法をクエリに伝えるorのようなブール演算子が必要です。「スーパー&マン」はおそらくうまくいくでしょう。&|

AND スタイルのクエリの単純なケースでクエリを作成する手間を省くために、plainto_tsqueryこれが少し簡単になります。あなたの場合、:qパラメータを呼び出しでラップしますplainto_tsquery

plainto_tsquery(:q)
于 2013-05-09T15:59:12.220 に答える