Inquiridor
Busca fonetica no SQL SERVER 2005 sem o uso do soundex

Discussão Geral
-
Desenvolvi funções para realizar busca fonética sem a necessidade de usar o SOUNDEX.
vocem podem criar campos "nome_fonetizado", "nome_mae_fonetizado"
criar uma trigger mais ou menos assim:
CREATE TRIGGER [dbo].[TRG_FUNCIONARIO_INS] ON [dbo].[FUNCIONARIO]
WITH EXECUTE AS CALLER
FOR INSERT, UPDATE
AS
DECLARE @NRFUNCIONARIO VARCHAR(60)
DECLARE @NOME VARCHAR(30)
DECLARE @NM_MAE VARCHAR(60)
DECLARE @NOME_FONETIZADO VARCHAR(60)
DECLARE @NM_MAE_FONETIZADO VARCHAR(60)
SELECT @NRFUNCIONARIO = NRFUNCIONARIO FROM INSERTED
SELECT @NOME = NOME FROM INSERTED
SELECT @NM_MAE = NM_MAE FROM INSERTED
UPDATE dbo.FUNCIONARIO
SET NOME_FONETIZADO = dbo.FUNC_FONETIZAR(@NOME,'0'),
NM_MAE_FONETIZADO = dbo.FUNC_FONETIZAR(@NM_MAE,'0')
WHERE NRFUNCIONARIO = @NRFUNCIONARIO
GO
e usar para pesquisa assim:
SELECT F.NOME
FROM FUNCIONARIO F
WHERE F.NOME_FONETIZADO LIKE dbo.FUNC_FONETIZAR('GEZUS BARBALIO','1')
RETORNO: ANA DE JESUS BARBALHO
baixem e comentem.
klebermoura.pa@gmail.com
http://w13.easy-share.com/1699646408.html
Todas as Respostas
-
-
cara, muito bom esse algoritmo... eu estou trabalhando em algumas correções e otimizações nele agora e em breve disponibilizo o código que alterei mas vou comentar algumas coisas que fiz e gostaria que você comentasse a respeito:
1. Na função FUNC_FONETIZAR_PARTICULA eu alterei o código da letra "U" de "a" para "f" já que eu não entendi porque você agrupou a letra "U" com as letras "V" e "W" (código "a") já que quando o "W" possuir som de "U" nessa mesma função existe um tratamento para substituí-lo por "U".
2. Na função FUNC_REMOVE_ACENTO eu alterei a substituição da letra "Ç" de "C" para "S".
3. Removi todos os labels e "GOTO" que eram utilizados nas funções (incluindo o da função FUNC_REMOVE_ACENTO, que no lugar do GOTO foram utilizados vários replaces o que reduziu em aproximadamente 50% o tempo de processamento).
4. Eu sei que a trigger que você passou foi só de exemplo mas eu resolvi usar ela e, para quem pretender utilizar vai uma dica: A trigger só funciona para inserts/updates que afetam somente uma linha. Ou seja, se você executar um update do tipo "UPDATE TABLE CLIENTE SET NOME = NOME" a trigger só irá disparar para um registro. Para corrigir o problema deve ser utilizada a cláusula "UPDATE FROM".
Agora algumas dúvidas...
a) No que você se baseou para gerar os códigos fonéticos?
A minha necessidade de trocar o código da letra "U" de "a" para "f" foi que em alguns casos estavam sendo gerados códigos fonéticos semelhantes para palavras com pouca ou nenhuma semelhança.
(Alves e Luis por exemplo).
b) De onde surgiu a necessidade de criar a função FUNC_SUBSTITUI_TERMINACAO?
Eu acho que entendi mais ou menos a idéia dela mas não entendi exatamente em quais casos ela vai ajudar.
(E por que você criou aquela exceção para terminais em "N")
Acho que por enquanto é isso...
E parabéns pelo código! Me ajudou muito!
[]s -
-
Kleber. Obrigado pelo post.Me ajudou muito. Havia testado o algoritimo BUSCABR que não me atendeu muito bem.O seu algoritimo atende melhor a minha necessidade.OBS: Testei a comparação direta do campo Fonetizado com a função e existe um problema de performance. Para que a função não fosse executada em todo registro, gravei o texto a ser pesquisado em uma variavável para obter seu código. a partir dai faço as comparações que são rápidas por não executar a função.Abraços.Parabéns pelo post.
Analísta Programador jr. -
Kleber,
Muito bom o seu algorítmo.
Fiz uma implementação deste algorítmo em C#. Se alguém se interessar está publicado em http://eversonss.wordpress.com/2011/08/24/busca-fontica-em-c/
[]'s
-
-