2013-04-08 18 views
16

Sono un po 'confuso con l'intero concetto di PostgreSQL, ricerca a testo integrale e Trigram. In tutta la mia query di ricerca di testo, sto usando tsvectors, in questo modo:PostgreSQL Ricerca di testo completo e confusione di Trigram

SELECT * FROM articles 
WHERE search_vector @@ plainto_tsquery('english', 'cat, bat, rat'); 

Il problema è che questo metodo non tiene conto per errore di ortografia. Poi ho iniziato a leggere su Trigram and pg_trgm:

Guardando attraverso altri esempi, sembra che venga utilizzato il trigramma o che vengano utilizzati i vettori, ma mai entrambi. Quindi le mie domande sono: sono mai stati usati insieme? Se é cosi, come? Il trigram sostituisce il testo completo? I trigram sono più precisi? E come sono i trigram sulle prestazioni?

risposta

29

Servono a scopi molto diversi.

  • ricerca full-text viene utilizzato per restituire i documenti che corrispondono a una query di ricerca di parole stelo.
  • I trigrammi forniscono un metodo per confrontare due stringhe e determinare la loro somiglianza.

considerare i seguenti esempi:

SELECT 'cat' % 'cats'; --true 

I rendimenti superiori vero perché 'cat' è del tutto simile a 'cats' (come dettato dal limite di pg_trgm).

SELECT 'there is a cat with a dog' % 'cats'; --false 

I rendimenti superiori false perché % è alla ricerca di similmente tra le due intere stringhe, non cercando la parola catsall'interno della stringa.

SELECT to_tsvector('there is a cat with a dog') @@ to_tsquery('cats'); --true 

Ciò restituisce true becauase tsvector trasformato la stringa in una lista di parole gambo e ignorato un mucchio di parole comuni (fermata parole - come 'è' & 'a') ... poi cercato per la versione a stelo di cats.

Sembra che si desidera utilizzare per trigrammi correzione automatica tua ts_query, ma che non è davvero possibile (non in alcun modo efficiente in ogni caso). In realtà non lo fanno sa una parola è sbagliata, proprio come potrebbe essere simile a un'altra parola. può essere utilizzato per cercare una tabella di parole per cercare e trovare parole simili, consentendo di implementare una funzionalità di tipo "volevi dire ...", ma questa parola richiede di mantenere una tabella separata contenente tutte le parole utilizzate nel tuo search campo.

Se si dispone di alcuni comuni errori di ortografia parole/frasi che si desidera che il testo-index per abbinare si potrebbe desiderare di guardare Synonym Dictorionaries

+0

ho aggiunto un paio di esempi per evidenziare le differenze tra '%' e ' @@ 'da ogni estensione. Se il tuo scopo è quello di trovare documenti che contengono inglese (o qualsiasi lingua conosciuta per la quale hai un dizionario), allora stai cercando testo completo. Se il tuo obiettivo è quello di abbinare un intero campo a una stringa dell'intero campo con un po 'di margine per gli errori di battitura, allora pg_trgm è quello che vuoi. –

+0

Grazie per la spiegazione! Questo ha chiarito molto. Ok, quindi sembra che il problema possa essere risolto espandendo la mia conoscenza dei dizionari. –

+1

+1 Risposta buona e chiara. –

Problemi correlati