PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Postgres-Akzent-unempfindliche LIKE-Suche in Rails 3.1 auf Heroku

Die Lösung des armen Mannes

Wenn Sie eine Funktion erstellen können, können Sie diese verwenden. Ich habe die Liste ab hier zusammengestellt und im Laufe der Zeit ergänzt. Es ist ziemlich vollständig. Vielleicht möchten Sie sogar einige Zeichen entfernen:

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

Ihre Abfrage sollte folgendermaßen funktionieren:

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

Für links verankerte Suchen können Sie einen Index für die Funktion sehr verwenden schnelle Ergebnisse:

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

Für Abfragen wie:

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

Richtige Lösung

In PostgreSQL 9.1+ , mit den erforderlichen Berechtigungen können Sie einfach:

CREATE EXTENSION unaccent;

die eine Funktion unaccent() bereitstellt , tun, was Sie brauchen (außer lower()). , verwenden Sie das einfach bei Bedarf zusätzlich). Lesen Sie das Handbuch zu dieser Erweiterung .
Auch verfügbar für PostgreSQL 9.0 aber CREATE EXTENSION Syntax ist neu in 9.1.

Mehr über Akzent und Indizes: