Pesquisa Fonética

Seria bom termos uma SC_fonetica(), para implementarmos a pesquisa fonética em português, para qualquer banco.
Hoje eu implementei uma pl/sql pro postgres, usei a função do maysql… mas se tenho de mudar de banco complica, não !!! eu quis dizer da trabalho. Não creio que seja tão difícil implementar. Já estou pensando em fazê-lo com uma biblioteca

Prezado Alcebíades,

Em que casos seria utilizada essa pesquisa fonética???

Você poderia citar um exemplo prático para ver se temos alguma macro que possa lhe ajudar??

Aguardo contato

Atenciosamente

Érico Oliveira

Caro Erico Oliveira,

Um bom exemplo é o que estou fazendo onde trabalho, um sistema de questionários, tenho uma tabela de perguntas, e ao cadastrar perguntas, por exmplo:

codigo, descrição
1 quantos habitantes tem em São Paulo ?
2 quantos habitantes tem em Sao Paulo ?

as duas perguntas são diferentes, mesmo criando uma chave única para descrição ou até mesmo um metodo no before insert ou no onvalidate, concorda ?

com uma pesquisa fonética seria mais fácil evitar esse transtorno !

trabalhei muito com banco de dados comprados para telemarketing

um outro exemplo seria quando o operador tem que procurar um nome

Maria da Silva
Mario da Silva

foneticamente o operador escuta proximo entao vc teria um nome do tipo
MrSlv que localizaria os dois

Olá Alcebiades,

Utilizo postgres e estou a tempos atrás de um código para
resolver este problema da fonética,

Poderia postar a sua solução, ou enviar por email para eu
ver como resolveu este problema ?

Realmente seria de grande ajuda uma pesquisa fonetica()
principalmente se esta funcionar em busca auto-complete,
onde o usuário busca por exemplo:

Humberto ou Umberto, Souza ou Sousa, entre outros
exemplos.

Agradeço se me enviar como resolver.

Obrigado,

Clifor Travaini
Solução Informática Jundiaí Ltda.
www.solucaojundiai.com.br

Pessoal,

Alguém já tentou usar o SOUNDEX()?

http://www.mariosam.com/desenvolvimento/sql/mysql-sql/mysql-usando-o-soundex

Olá Alcebiades,

Tb utilizo postgres e me deparo com o mesmo problema.
Poderia postar a sua solução para eu ver como foi feito e ver se dar pra resolver o meu problema ?
valeu.

À quem interessar, com algumas modificações dá para utilizar…

CREATE OR REPLACE FUNCTION fc_fonetica( text) RETURNS text AS
$BODY$
declare
sString text;
sRetorno text;
cLetra char(1);
cProximaLetra char(1);
cLetraAnterior char(1);
iConta integer;
begin

    if ($1 is not null) then
    sString  := trim(upper($1));
    sRetorno := '';
    
    for iConta in 1..length(sString)
    loop
            cLetra         := substr(sString, iConta, 1);
            cProximaLetra  := substr(sString, iConta+1, 1);
            cLetraAnterior := substr(sString, iConta-1, 1);

            if cLetra = ' ' then
                    sRetorno := sRetorno || '0';
                    
            elsif cLetra = 'C' then
                    
                    if cProximaLetra = 'H' then
                            sRetorno := sRetorno || 'X';

                    elsif cProximaLetra in ('E', 'I') then
                            sRetorno := sRetorno || 'SS';

                    else
                            sRetorno := sRetorno || 'K';

                    end if;

            elsif cLetra in ('B', 'D', 'F', 'G', 'J', 'K', 'L', 'M', 'R', 

‘T’, ‘V’, ‘X’)
then
sRetorno := sRetorno || cLetra;

            elsif cLetra = 'N' then
                    
                    if cProximaLetra in ('', '0') or cProximaLetra not in 

(‘A’, ‘E’, ‘I’, ‘O’, ‘U’) then
sRetorno := sRetorno || ‘M’;
else
sRetorno := sRetorno || ‘N’;
end if;

            elsif cLetra = 'P' then
                    
                    if cProximaLetra = 'H' then
                            sRetorno := sRetorno || 'F';
                    else
                            sRetorno := sRetorno || 'P';
                    end if;
            
            elsif cLetra = 'Q' then
                    sRetorno := sRetorno || 'K';

            elsif cLetra = 'S' then
            
                    if cProximaLetra = 'H' then 
                            sRetorno := sRetorno || 'X';
                    elsif cLetraAnterior = 'S' or cProximaLetra = 'S' or 

cProximaLetra not in
(‘A’, ‘E’, ‘I’, ‘O’, ‘U’) then
sRetorno := sRetorno || ‘S’;
elsif iConta = 0 or cProximaLetra not in (‘A’, ‘E’,
‘I’, ‘O’, ‘U’) then
sRetorno := sRetorno || ‘SS’;
else
sRetorno := sRetorno || ‘Z’;
end if;

            elsif cLetra = 'W' then
                    
                    if cProximaLetra in ('A', 'E', 'I', 'O', 'U') then
                            sRetorno := sRetorno || 'V';
                    end if;

            elsif cLetra = 'Z' then

                    if cProximaLetra = 'Z' then
                            sRetorno := sRetorno || 'Z';
                    elsif cLetraAnterior = 'Z' then
                            sRetorno := sRetorno || '';
                    elsif cProximaLetra not in ('A', 'E', 'I', 'O', 'U') 

then
sRetorno := sRetorno || ‘S’;
elsif cProximaLetra = ‘’ then
sRetorno := sRetorno || ‘s’;
else
sRetorno := sRetorno || ‘Z’;
end if;

            end if;

    end loop;

    return sRetorno;

else
return ‘’;
end if;
end;
$BODY$
LANGUAGE ‘plpgsql’ IMMUTABLE;