sql >> Databáze >  >> RDS >> PostgreSQL

Postgres vyhledávání LIKE necitlivé na přízvuk v Rails 3.1 na Heroku

Ubohé řešení

Pokud jste schopni vytvořit funkci, můžete použít tuto. Sestavil jsem seznam počínaje zde a časem se k tomu přidal. Je docela kompletní. Můžete dokonce chtít odstranit některé znaky:

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

Váš dotaz by měl fungovat takto:

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

Pro vyhledávání ukotvená vlevo můžete využít index na funkci pro velmi rychlé výsledky:

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

Pro dotazy typu:

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

Správné řešení

V PostgreSQL 9.1+ , s nezbytnými oprávněními můžete:

CREATE EXTENSION unaccent;

která poskytuje funkci unaccent() , dělá to, co potřebujete (kromě lower() , v případě potřeby jej použijte dodatečně). Přečtěte si příručku o tomto rozšíření .
K dispozici také pro PostgreSQL 9.0 ale CREATE EXTENSION syntaxe je nová ve verzi 9.1.

Více o bezpřízvuku a indexech:



  1. Tomcat JDBC MySQL ClassNotFoundException

  2. Může InnoDB použít soubor ignorovaných slov?

  3. Stát se superuživatelem databáze – Engineyard

  4. vyberte pro aktualizaci pomocí odlišného mysql