PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Postgres niewrażliwy na akcentowanie wyszukiwania LIKE w Rails 3.1 na Heroku

Rozwiązanie biednego człowieka

Jeśli jesteś w stanie stworzyć funkcję, możesz użyć tej. Skompilowałem listę zaczynając tutaj i dodawane z czasem. Jest całkiem kompletny. Możesz nawet usunąć niektóre znaki:

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

Twoje zapytanie powinno działać tak:

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

W przypadku wyszukiwań zakotwiczonych z lewej strony możesz użyć indeksu funkcji bardzo szybkie wyniki:

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

W przypadku zapytań takich jak:

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

Właściwe rozwiązanie

W PostgreSQL 9.1+ , mając niezbędne uprawnienia, możesz po prostu:

CREATE EXTENSION unaccent;

która udostępnia funkcję unaccent() , robiąc to, czego potrzebujesz (z wyjątkiem lower() , po prostu użyj tego dodatkowo w razie potrzeby). Przeczytaj podręcznik dotyczący tego rozszerzenia .
Dostępne również dla PostgreSQL 9.0 ale CREATE EXTENSION składnia jest nowa w wersji 9.1.

Więcej o nieakcentach i indeksach:



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Zablokuj na SELECT, aby inny proces nie otrzymał starych danych

  2. błąd :podzapytanie musi zwrócić tylko jedną kolumnę

  3. Zaktualizuj swoje hasło do PostgreSQL w systemie Linux

  4. org.postgresql.util.PSQLException:próba połączenia nie powiodła się

  5. Jak przyspieszyć strony administracyjne Django za pomocą szacowania liczby PostgreSQL?