Arme man's oplossing
Als u een functie kunt maken, kunt u deze gebruiken. Ik heb de lijst samengesteld vanaf hier en er in de loop van de tijd aan toegevoegd. Het is vrij compleet. Misschien wilt u zelfs enkele tekens verwijderen:
CREATE OR REPLACE FUNCTION lower_unaccent(text)
RETURNS text AS
$func$
SELECT lower(translate($1
, '¹²³áàâãäåāăąÀÁÂÃÄÅĀĂĄÆćčç©ĆČÇĐÐèéêёëēĕėęěÈÊËЁĒĔĖĘĚ€ğĞıìíîïìĩīĭÌÍÎÏЇÌĨĪĬłŁńňñŃŇÑòóôõöōŏőøÒÓÔÕÖŌŎŐØŒř®ŘšşșߊŞȘùúûüũūŭůÙÚÛÜŨŪŬŮýÿÝŸžżźŽŻŹ'
, '123aaaaaaaaaaaaaaaaaaacccccccddeeeeeeeeeeeeeeeeeeeeggiiiiiiiiiiiiiiiiiillnnnnnnooooooooooooooooooorrrsssssssuuuuuuuuuuuuuuuuyyyyzzzzzz'
));
$func$ LANGUAGE sql IMMUTABLE;
Uw zoekopdracht zou zo moeten werken:
find(:all, :conditions => ["lower_unaccent(name) LIKE ?", "%#{search.downcase}%"])
Voor links-verankerde zoekopdrachten kunt u een index op de functie gebruiken voor zeer snelle resultaten:
CREATE INDEX tbl_name_lower_unaccent_idx
ON fest (lower_unaccent(name) text_pattern_ops);
Voor vragen als:
SELECT * FROM tbl WHERE (lower_unaccent(name)) ~~ 'bob%'
Goede oplossing
In PostgreSQL 9.1+ , met de nodige privileges, kunt u gewoon:
CREATE EXTENSION unaccent;
die een functie biedt unaccent()
, doen wat je nodig hebt (behalve lower()
, gebruik dat gewoon extra als dat nodig is). Lees de handleiding over deze extensie
.
Ook beschikbaar voor PostgreSQL 9.0 maar CREATE EXTENSION
syntaxis is nieuw in 9.1.
Meer over unaccent en indexen: