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

Búsqueda LIKE insensible al acento de Postgres en Rails 3.1 en Heroku

La solución del pobre

Si puede crear una función, puede usar esta. Compilé la lista comenzando aquí y añadido a ella con el tiempo. Es bastante completo. Es posible que incluso desee eliminar algunos caracteres:

CREATE OR REPLACE FUNCTION lower_unaccent(text)
  RETURNS text AS
$func$
SELECT lower(translate($1
     , '¹²³áàâãäåāăąÀÁÂÃÄÅĀĂĄÆćčç©ĆČÇĐÐèéêёëēĕėęěÈÊËЁĒĔĖĘĚ€ğĞıìíîïìĩīĭÌÍÎÏЇÌĨĪĬłŁńňñŃŇÑòóôõöōŏőøÒÓÔÕÖŌŎŐØŒř®ŘšşșߊŞȘùúûüũūŭůÙÚÛÜŨŪŬŮýÿÝŸžżźŽŻŹ'
     , '123aaaaaaaaaaaaaaaaaaacccccccddeeeeeeeeeeeeeeeeeeeeggiiiiiiiiiiiiiiiiiillnnnnnnooooooooooooooooooorrrsssssssuuuuuuuuuuuuuuuuyyyyzzzzzz'
     ));
$func$ LANGUAGE sql IMMUTABLE;

Su consulta debería funcionar así:

find(:all, :conditions => ["lower_unaccent(name) LIKE ?", "%#{search.downcase}%"])

Para búsquedas ancladas a la izquierda, puede utilizar un índice en la función para muy resultados rápidos:

CREATE INDEX tbl_name_lower_unaccent_idx
  ON fest (lower_unaccent(name) text_pattern_ops);

Para consultas como:

SELECT * FROM tbl WHERE (lower_unaccent(name)) ~~ 'bob%'

Solución adecuada

En PostgreSQL 9.1+ , con los privilegios necesarios, solo puede:

CREATE EXTENSION unaccent;

que proporciona una función unaccent() , haciendo lo que necesita (excepto lower() , solo utilícelo adicionalmente si es necesario). Lea el manual sobre esta extensión .
También disponible para PostgreSQL 9.0 pero CREATE EXTENSION la sintaxis es nueva en 9.1.

Más sobre sin acento e índices: