Estou enfrentando uma situação em que os usuários DEVEM enviar itens escritos em inglês simples. No entanto, acontece que os nomes têm acentos - vindos de vários idiomas. Eu tenho uma tsvector
coluna na minha tabela que é indexada para pesquisa de texto completo.
Aqui estão as informações sobre esta coluna e informações relevantes sobre a tabela:
Table "public.companies"
Column | Type | Modifiers | Storage | Stats target | Description
----------------+------------------------+--------------------------------------------------------+----------+--------------+-------------
id | integer | not null default nextval('companies_id_seq'::regclass) | plain | |
name | character varying(128) | not null | extended | |
description | text | | extended | |
tsmeta | tsvector | | extended | |
Indexes:
"companies_pkey" PRIMARY KEY, btree (id) CLUSTER
"companies_search_idx" gin (tsmeta)
Triggers:
companies_tsmeta_update BEFORE INSERT OR UPDATE ON companies FOR EACH ROW EXECUTE PROCEDURE companies_tsmeta_trigger()
Agora o problema vem quando o usuário cria um nome como français . Nem todos os usuários têm o caractere ç em mãos e aqueles que não têm terão problemas para encontrar essa entrada - o que significa que ela será armazenada com o cedilla-c na tsvector
coluna. Então meu pensamento foi usar a unaccent
extensão para tirar esses acentos. Porém agora os usuários que apenas digitarem français terão problemas e não encontrarão a entrada. Então eu criei uma função que apenas concatena as duas versões (acentuadas e sem acentos) do nome e das descrições. No entanto, as descrições podem ficar muito grandes e eu me preocupo que o índice leve muito armazenamento.
create or replace function companies_tsmeta_trigger() returns trigger as $$
begin
new.tsmeta :=
setweight(to_tsvector('english', coalesce(new.name, '')), 'A') ||
setweight(to_tsvector('english', unaccent(coalesce(new.name, ''))), 'B') ||
setweight(to_tsvector('english', coalesce(new.description, '')), 'C') ||
setweight(to_tsvector('english', unaccent(coalesce(new.description, ''))), 'D');
return new;
end;
$$ language plpgsql;
Quais são suas sugestões?