2013-05-09 9 views
5

Sto seguendo insieme a Railscast di Ryan Bates nella ricerca a testo integrale con Postgres, tuttavia, sta usando Postgres 9.1 e sto usando 9.2. Costruisce la seguente query per eseguire una ricerca. Funziona per me se la mia query è una singola parola, ad esempio "superman", ma se si tratta di due parole, ad esempio dc comics o super man, ricevo questo errore, che è appena nuovo per Postgres Non riesco a capire come aggiustare. Potete assistere?errore di ricerca postgres query se lo spazio utilizzato

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 da 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 

risposta

12

@@ viene utilizzato per confrontare un tsvector con tsquery. Stai cercando di confrontare uno tsvector con qualcosa che non è valido tsquery.

'superman' è di tipo text e deve essere effettivamente racchiuso in una chiamata a to_tsquery(). Comunque sembra che postgres abbia cercato di aiutarti e costringerlo in un tsquery per te, e to_tsquery ('superman') è una query valida.

'super man' è di tipo text e deve essere effettivamente racchiuso in una chiamata a to_tsquery(). Postgres ha fallito per costringerlo in un tsquery per te, dal momento che to_tsquery ('super man') è non una query valida. Un tsquery valido deve avere operatori booleani come & o | per dire alla query come trattare le parole. 'super & man' probabilmente funzionerebbe.

Per evitare di dover scrivere query per casi semplici di query in stile AND, plainto_tsquery rende questo un po 'più semplice. Nel tuo caso avvolgere la :q param in una chiamata a plainto_tsquery

plainto_tsquery(:q) 
+0

Grazie per il vostro aiuto. Ho avvolto il ': q' due volte come vedete qui, tuttavia, anche se non si interrompe ora in una ricerca di due parole come' è stato' non restituisce alcun risultato anche se 'è stato' esiste nel contenuto del mio db. è questo che ti aspetti? comunque per far sì che recuperi i risultati su una query di ricerca multi-parola? 'where (" to_tsvector ('english', name) @@ plainto_tsquery (: q) o to_tsvector ('inglese', contenuto) @@ plainto_tsquery (: q) ", q: query) .order (" # {rank} desc ")' – BrainLikeADullPencil

+1

Leggi su [stop parole] (http://www.postgresql.org/docs/9.2/static/textsearch-dictionaries.html). È probabile che "ha" e "stato" siano considerati troppo comuni nel dizionario inglese per preoccuparsi di indicizzarli. –

+0

ok, capisco. Sta restituendo risultati per parole meno comuni. Grazie. – BrainLikeADullPencil

Problemi correlati