9

私は、Rails で組み込みの PostgresQL 全文検索を使用することに関する Ryan Bates の優れたチュートリアルに従っています。私は現在、インデックス化されていない pg_search gem を問題なく使用していますが、パフォーマンスを改善する必要があります。「英語」辞書を指定して tsvector を使用しています。

PostgreSQL バージョン 9.1.4 を使用しています

Ryan の指示に従って、作成したい 2 つの新しいインデックスを指定するこのコードを使用して、新しい移行を実行しました。最初のスキーマは次のとおりです。

create_table "references", :force => true do |t|
  t.string   "title"
  t.string   "type"
  t.datetime "created_at",         :null => false
  t.datetime "updated_at",         :null => false
  t.string   "public_url"
  t.string   "content_type"
  t.integer  "file_size"
  t.text     "overview"
  t.text     "body"
  t.text     "full_text"
  t.integer  "folder_id"
end

私の移行は次のようになります。

def up
  execute "create index references_title on references using gin(to_tsvector('english', title))"
  execute "create index references_full_text on references using gin(to_tsvector('english', full_text))"
end

def down
  execute "drop index references_title"
  execute "drop index references_full_text"
end

また、application.rb の :sql オプションのコメントを外しました。

config.active_record.schema_format = :sql

同じ rake aborted エラーが引き続き発生します。

==  AddSearchIndexesToReferences: migrating ===================================
-- execute("CREATE INDEX references_title on references using gin(to_tsvector('english',    title))")
rake aborted!
An error has occurred, this and all later migrations canceled:

PG::Error: ERROR:  syntax error at or near "references"
LINE 1: CREATE INDEX references_title on references using gin(to_tsv...
                                     ^
: CREATE INDEX references_title on references using gin(to_tsvector('english', title))
4

1 に答える 1

7

REFERENCES は外部キーで使用されるキーワードであるため、二重引用符で囲まない限り、テーブル名として使用できません。

def up
  execute %q{create index references_title on "references" using gin(to_tsvector('english', title))}
  execute %q{create index references_full_text on "references" using gin(to_tsvector('english', full_text))}
end

また、SQL スニペットで使用する場所では、そのテーブル名を二重引用符で囲む必要があります。ただし、ActiveRecord が SQL を構築している場合は、引用を行います。多くの SQL スニペットでテーブル名を使用する予定がある場合は、引用の問題を気にする必要がないように、テーブルの名前を変更することをお勧めします。

于 2012-11-02T04:05:07.773 に答える