2012-11-02 21 views
8

Podążam za przykładem użytkownika Ryana Batesa excellent tutorial przy użyciu wbudowanego wyszukiwania pełnotekstowego PostgresQL w Railsach. Obecnie używam pg_search gem un-indexed bez problemu, ale muszę poprawić wydajność. Używam tsvector z określonym słownikiem "angielski".Nie można uruchomić prowizji db: migracja indeksu tensora tsvector dla PostgreSQL w Railsach przy użyciu przykładu Railscast

używam wersji PostgreSQL 9.1.4

według instrukcji Ryana, mam uruchomić nową migrację z tego kodu określającego dwóch nowych indeksów, które chciałbym stworzyć. Oto pierwszy schemat:

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 

Moja migracja wygląda następująco:

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 

Mam też poszła do przodu i Odkomentowano opcji: SQL w environment.rb

config.active_record.schema_format = :sql 

kontynuuję aby uzyskać ten sam rake, przerwany błąd:

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

Odpowiedz

7

LITERATURA to słowo kluczowe używane z więc nie można go używać jako nazwy tabeli, chyba że go podwoić Cytat:

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 

Będziesz mieć również podwoić cytat, który nazwę tabeli nigdzie go użyć w SQL skrawek. ActiveRecord zrobi cytowanie dla ciebie, jeśli buduje SQL. Jeśli spodziewasz się użyć nazwy tabeli w wielu fragmentach kodu SQL, to polecam zmianę nazwy tabeli, aby nie musieć przejmować się problemem cytowania.