sql >> Databasteknik >  >> RDS >> PostgreSQL

Postgres accentokänsliga LIKE-sökning i Rails 3.1 på Heroku

Fattig mans lösning

Om du kan skapa en funktion kan du använda den här. Jag sammanställde listan med början här och läggs till med tiden. Det är ganska komplett. Du kanske till och med vill ta bort några tecken:

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

Din fråga borde fungera så här:

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

För vänsterförankrade sökningar kan du använda ett index på funktionen för mycket snabba resultat:

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

För frågor som:

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

Rätt lösning

I PostgreSQL 9.1+ , med nödvändiga privilegier kan du bara:

CREATE EXTENSION unaccent;

som tillhandahåller en funktion unaccent() , gör det du behöver (förutom lower() , använd det bara om det behövs). Läs manualen om detta tillägg .
Även tillgänglig för PostgreSQL 9.0 men CREATE EXTENSION syntax är ny i 9.1.

Mer om unaccent och index:



  1. mysql - ligger idag mellan två kolumnvärden

  2. PDO och php - Anrop till en medlemsfunktion prepare() på ett icke-objekt

  3. Standardparameter i Oracle-proceduren

  4. MySQL:Få kolumner efter värdeprioriteter