Решение за бедния човек
Ако можете да създадете функция, можете да използвате тази. Съставих списъка, започвайки тук и се добавя към него с течение на времето. Това е доста пълно. Може дори да искате да премахнете някои знаци:
CREATE OR REPLACE FUNCTION lower_unaccent(text)
RETURNS text AS
$func$
SELECT lower(translate($1
, '¹²³áàâãäåāăąÀÁÂÃÄÅĀĂĄÆćčç©ĆČÇĐÐèéêёëēĕėęěÈÊËЁĒĔĖĘĚ€ğĞıìíîïìĩīĭÌÍÎÏЇÌĨĪĬłŁńňñŃŇÑòóôõöōŏőøÒÓÔÕÖŌŎŐØŒř®ŘšşșߊŞȘùúûüũūŭůÙÚÛÜŨŪŬŮýÿÝŸžżźŽŻŹ'
, '123aaaaaaaaaaaaaaaaaaacccccccddeeeeeeeeeeeeeeeeeeeeggiiiiiiiiiiiiiiiiiillnnnnnnooooooooooooooooooorrrsssssssuuuuuuuuuuuuuuuuyyyyzzzzzz'
));
$func$ LANGUAGE sql IMMUTABLE;
Вашата заявка трябва да работи така:
find(:all, :conditions => ["lower_unaccent(name) LIKE ?", "%#{search.downcase}%"])
За ляво закотвени търсения можете да използвате индекс на функцията за много бързи резултати:
CREATE INDEX tbl_name_lower_unaccent_idx
ON fest (lower_unaccent(name) text_pattern_ops);
За заявки като:
SELECT * FROM tbl WHERE (lower_unaccent(name)) ~~ 'bob%'
Правилно решение
В PostgreSQL 9.1+ , с необходимите привилегии, можете просто:
CREATE EXTENSION unaccent;
който предоставя функция unaccent()
, правейки това, от което се нуждаете (с изключение на lower()
, просто го използвайте допълнително, ако е необходимо). Прочетете ръководството за това разширение
.
Също така се предлага за PostgreSQL 9.0 но CREATE EXTENSION
синтаксисът е нов в 9.1.
Повече за неударението и индексите: