2012-11-02 13 views
8

Ich bin auf Ryan Bates ' bei der Verwendung der integrierten PostgresQL-Volltextsuche in Rails folgen. Ich benutze derzeit pg_search gem un-indexed kein Problem, aber ich muss die Leistung verbessern. Ich benutze Tsvector mit "Englisch" Wörterbuch angegeben.Rake db nicht ausführen: migrieren ein tsvector GIN-Index für Postgresql in Rails mit Railscast Beispiel

ich PostgreSQL Version bin mit Anweisungen 9.1.4

Per Ryan, ich habe eine neue Migration mit diesem Code ausführen zwei neue Indizes angeben, die Ich mag würde erstellen. Hier ist das Schema zuerst:

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 

Meine Migration wie folgt aussieht:

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 

Ich habe auch voraus gegangen und unkommentiert die SQL-Option in application.rb

config.active_record.schema_format = :sql 

ich weiter um den gleichen Rake abzureißen Fehler:

== 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)) 

Antwort

7

Informationsquellen ist ein Schlüsselwort, mit verwendet, so kann man es nicht als Tabellennamen verwenden, wenn Sie es Zitat verdoppeln:

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 

Sie finden auch überall Zitat, dass Tabellennamen zu verdoppeln haben Sie es in einer SQL verwenden Schnipsel. ActiveRecord führt das Zitat für Sie durch, wenn es das SQL jedoch baut. Wenn Sie erwarten, den Tabellennamen in vielen SQL-Snippets zu verwenden, empfehle ich Ihnen, die Tabelle umzubenennen, damit Sie sich nicht um das Problem des Angebots kümmern müssen.