Non stai usando la classe operator fornita da pg_trgm
modulo. Creerei un indice come questo:
CREATE INDEX label_Lower_unaccent_trgm_idx ON test_trgm USING gist (lower(unaccent_text(label)) gist_trgm_ops);
Inizialmente, avevo un indice GIN qui, ma in seguito ho appreso che un GiST è probabilmente ancora più adatto per questo tipo di query perché può restituire valori ordinati per somiglianza. Maggiori dettagli:
- Postgresql:abbinamento di modelli tra due colonne
- Trovare rapidamente stringhe simili con PostgreSQL
La tua query deve corrispondere all'espressione dell'indice per poterla utilizzare.
SELECT label
FROM the_table
WHERE lower(unaccent_text(label)) % 'fil'
ORDER BY similarity(label, 'fil') DESC -- it's ok to use original string here
Tuttavia, "nocciola" e "filé in polvere" non sono in realtà molto simili a "fil" secondo l'operatore %. Sospetto che quello che vuoi veramente sia questo:
SELECT label FROM the_table WHERE lower(unaccent_text(label)) ~~ '%fil%' ORDER BY similarity(label, 'fil') DESC -- it's ok to use original string here
Questo troverà tutte le stringhe contenenti la stringa di ricerca e ordinerà le migliori corrispondenze in base al %
prima l'operatore.
E la parte succosa:l'espressione può utilizzare un indice GIN o GiST da PostgreSQL 9.1 ! Cito il manuale sul pg_trgm moule:
A partire da PostgreSQL 9.1, questi tipi di indice supportano anche le ricerche di indice per LIKE e ILIKE, ad esempio
Se in realtà intendevi usare il %
operatore:
Hai provato a abbassare la soglia per l'operatore di somiglianza %
con set_limit()
:
SELECT set_limit(0.1);
o anche inferiore? Il valore predefinito è 0,3. Solo per vedere se è la soglia che filtra le corrispondenze aggiuntive.