sql >> Base de Datos >  >> RDS >> PostgreSQL

Cadenas UTF-8 similares para el campo de autocompletar

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.