PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Stringhe UTF-8 simili per il campo di completamento automatico

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.