none
Busca fonetica no SQL SERVER 2005 sem o uso do soundex RRS feed

  • 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

    quinta-feira, 13 de março de 2008 13:09

Todas as Respostas

  • Kleber,

     

    Parabéns muito legal.

    quinta-feira, 13 de março de 2008 13:18
  • 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
    terça-feira, 5 de agosto de 2008 16:44
  •  

    Koiti, vc poderia disponibilizar os arquivos com as alterações que vc efetuou?
    terça-feira, 6 de janeiro de 2009 01:45
  • 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.
    sexta-feira, 26 de fevereiro de 2010 20:36
  • 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

    quarta-feira, 24 de agosto de 2011 18:52
  • Bom dia!

    Cara não estou conseguindo baixar o arquivo, pode mandar em meu e-mail?

    elissonprates@hotmail.com


    Estudando muito como sempre!

    terça-feira, 4 de dezembro de 2012 10:45
  • Ola Kleber,

    Nao estou conseguindo baixar o arquivo pelo linq do easy-share, tem como mandar para meu email ( leandromussi@hotmail.com).

    Desde já, agradeço.


    Mussi

    domingo, 16 de junho de 2013 22:52