2009-09-28 13 views
12

Diciamo che avete un Postgres 8.3 tabella come segue:Come si fa la ricerca full-text basata su frasi in postgres che sfrutta l'indice full-text?

CREATE TABLE t1 (body text, body_vector tsvector);

Voglio essere in grado di cercare per frasi utilizzando l'indice completo di testo (GIST, gin o entrambi sulla colonna tsvector). La soluzione migliore che sono riuscito a trovare è quella di eseguire prima la ricerca full text su entrambe le parole (booleano AND) e quindi fare un confronto simile sul corpo per la frase. Ovviamente, questo non riesce a catturare eventuali verifiche o controllo ortografico che la ricerca full-text di postgres fa per te. Un esempio di questo è se sto cercando la frase 'w1 w2', userei:

SELECT * FROM t1 WHERE body_vector @@ 'w1 & w2'::tsquery AND body LIKE 'w1 w2';

c'è un modo per fare questo, dove non c'è bisogno di ricorrere a cercare su la colonna di testo?

risposta

11

Se si desidera la corrispondenza esatta delle frasi, questo è il modo per farlo. Puoi anche provare WHERE body_vector @@ plainto_tsquery ('w1 w2'), quindi ordinarlo in base alla classifica. (Il punto è che i successi in cui le parole sono proprio accanto all'altra dovrebbero finire in cima)

4

Aggiornamento: PostgreSQL 9.6 ricerca supporta frasi

select 
    * 
from (values 
    ('i heart new york'), 
    ('i hate york new') 
) docs(body) 
where 
    to_tsvector(body) @@ phraseto_tsquery('new york') 

(1 row retrieved) 

o per distanza tra le parole:

-- a distance of exactly 2 "hops" between "quick" and "fox" 
select 
    * 
from (values 
    ('the quick brown fox'), 
    ('quick brown cute fox') 
) docs(body) 
where 
    to_tsvector(body) @@ to_tsquery('quick <2> fox') 

(1 row retrieved) 
+1

Forse non ho catturato qualcosa, ma non richiede la stringa di input per contenere la frase cercata tra virgolette singole? Come si può usarlo in generale, quando la frase proviene da un input auser e il documento proviene da una colonna del database? –

+1

Questo non è ancora "ricerca di frasi". Funziona solo da quando la tua frase di tsvector 'new york' è racchiusa tra virgolette singole. – soyayix

+0

Sì, entrambe le funzioni - ma la stringa tsvector nella maggior parte dei casi non avrà citazioni singole su di esse - se fa allora qual è la frase di ricerca per .. Ho un postgreSQL 9.4 e la query che hai funziona - questo non è solo specifico per 9.6. selezionare 'i heart new york city' :: tsvector @@ 'new' :: tsquery, --true 'i heart new york city' :: tsvector @@ 'new & york' :: tsquery, - true 'i heart new york city' :: tsvector @@ '' 'new york' '' :: tsquery --false – soyayix

Problemi correlati