PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Търсене LIKE, нечувствително към акцента на Postgres в Rails 3.1 на Heroku

Решение за бедния човек

Ако можете да създадете функция, можете да използвате тази. Съставих списъка, започвайки тук и се добавя към него с течение на времето. Това е доста пълно. Може дори да искате да премахнете някои знаци:

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.

Повече за неударението и индексите:



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Вземете отделната сума от колона на присъединена таблица

  2. Диалектът трябва да бъде изрично предоставен от v4.0.0

  3. Как да намерите всички редове с NULL стойност във всяка колона с помощта на PostgreSQL

  4. Нови и развиващи се функции на PostgreSQL Enterprise с последните версии

  5. Командата Django 1.8 inspectdb не вижда PostgreSQL изгледи според документацията