貧乏人の解決策
関数を作成できる場合は、これを使用できます。 ここ からリストを編集しました。 時間をかけて追加しました。かなり完成です。一部の文字を削除することもできます:
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%'
適切なソリューション
PostgreSQL9.1以降の場合 、必要な権限があれば、次のことができます。
CREATE EXTENSION unaccent;
関数unaccent()
を提供します 、必要なことを実行します(lower()
を除く) 、必要に応じて追加で使用してください)。 この拡張機能に関するマニュアル
をお読みください 。
PostgreSQL 9.0でも利用可能 ただし、CREATE EXTENSION
構文は9.1の新機能です。
アクセントなしとインデックスの詳細: