FTS non supporta LIKE
La risposta precedentemente accettata non era corretta. La ricerca full text con i suoi indici full text non è affatto per l' LIKE
operatore, ha i propri operatori e non funziona per stringhe arbitrarie. Funziona su parole basate su dizionari e stemming. Si fa il supporto prefisso di corrispondenza per le parole , ma non con l' LIKE
operatore:
Indici Trigram per LIKE
Installare il modulo aggiuntivo pg_trgm
che prevede classi di operatori per gin GiST trigram indici per supportare tutte LIKE
e ILIKE
modelli , non appena lasciato ancorati quelli:
Indice di esempio:
CREATE INDEX tbl_col_gin_trgm_idx ON tbl USING gin (col gin_trgm_ops);
O:
CREATE INDEX tbl_col_gist_trgm_idx ON tbl USING gist (col gist_trgm_ops);
Query di esempio:
SELECT * FROM tbl WHERE col LIKE '%foo%'; -- leading wildcard
SELECT * FROM tbl WHERE col ILIKE '%foo%'; -- works case insensitively as well
Trigrammi? E le stringhe più corte?
Le parole con meno di 3 lettere nei valori indicizzati funzionano ancora. Il manuale:
Si considera che ogni parola abbia due spazi prefissati e uno spazio come suffisso quando si determina l'insieme di trigrammi contenuti nella stringa.
E modelli di ricerca con meno di 3 lettere? Il manuale:
Per entrambe LIKE
le ricerche con espressioni regolari, tieni presente che un modello senza trigrammi estraibili degenererà in una scansione completa dell'indice.
Ciò significa che le scansioni dell'indice / indice bitmap funzionano ancora (i piani di query per l'istruzione preparata non si interrompono), semplicemente non ti offriranno prestazioni migliori. In genere nessuna grande perdita, poiché le stringhe di 1 o 2 lettere sono difficilmente selettive (più di una piccola percentuale delle corrispondenze di tabella sottostanti) e il supporto dell'indice non migliorerebbe le prestazioni all'inizio, perché una scansione completa della tabella è più veloce.
text_pattern_ops
per la corrispondenza del prefisso
Per i modelli ancorati a sinistra (nessun carattere jolly iniziale) si ottiene l'ottimale con una classe operatore adatta per un indice btree: text_pattern_ops
o varchar_pattern_ops
. Entrambe le funzionalità integrate di Postgres standard, non sono necessari moduli aggiuntivi. Prestazioni simili, ma indice molto più piccolo.
Indice di esempio:
CREATE INDEX tbl_col_text_pattern_ops_idx ON tbl(col text_pattern_ops);
Query di esempio:
SELECT * FROM tbl WHERE col LIKE 'foo%'; -- no leading wildcard
Oppure , se si dovrebbe eseguire il database con la locale "C" (effettivamente nessuna locale), allora tutto viene ordinato comunque in base all'ordine dei byte e un semplice indice btree con la classe operatore predefinita fa il lavoro.
Maggiori dettagli, spiegazioni, esempi e collegamenti in queste risposte correlate su dba.SE: