No está utilizando la clase de operador proporcionada por pg_trgm
módulo. Crearía un índice como este:
CREATE INDEX label_Lower_unaccent_trgm_idx ON test_trgm USING gist (lower(unaccent_text(label)) gist_trgm_ops);
Originalmente, tenía un índice GIN aquí, pero luego aprendí que un GiST probablemente sea aún más adecuado para este tipo de consulta porque puede devolver valores ordenados por similitud. Más detalles:
- Postgresql:Coincidencia de patrones entre dos columnas
- Encontrar cadenas similares con PostgreSQL rápidamente
Su consulta debe coincidir con la expresión de índice para poder utilizarla.
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
Sin embargo, "avellana" y "filé en polvo" en realidad no son muy similares a "fil" según el operador %. Sospecho que lo que realmente quieres es esto:
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
Esto encontrará todas las cadenas que contengan la cadena de búsqueda y ordenará las mejores coincidencias según el %
operador primero.
Y lo jugoso:la expresión puede usar un índice GIN o GiST desde PostgreSQL 9.1 ! Cito el manual del módulo pg_trgm:
A partir de PostgreSQL 9.1, estos tipos de índice también admiten búsquedas de índice para LIKE e ILIKE, por ejemplo
Si realmente querías usar el %
operador:
¿Has intentado bajar el umbral? para el operador de similitud %
con set_limit()
:
SELECT set_limit(0.1);
o incluso más bajo? El valor predeterminado es 0,3. Solo para ver si es el umbral el que filtra coincidencias adicionales.