Recursos especiais neste artigo:
Contém nota Quickupdate.
É muito comum utilizarmos o “like” quando precisamos realizar uma busca para resgatar dados, porém, o uso do mesmo nem sempre atende as necessidades, pois não levam em consideração possíveis erros de entrada de dados, ou seja, “erros humanos”. Neste artigo abordaremos com exemplos práticos e teóricos como utilizar a função nativa do Oracle chamada JARO_WINKLER_SIMILARITY e saber mais detalhes sobre o pacote UTL_MATCH e suas funções, aplicando posteriormente estes conhecimentos no Delphi.
Em que situação o tema é útil
Quando for necessário efetuar uma pesquisa textual, seja
essa por um possível campo “Nome” ou qualquer outro que aceite texto livre, que
requer um resultado não exato, ou seja, que deva retornar valores similares ao
informado para a busca.
Hoje em dia o nível de complexidade das informações armazenadas no SGBD é cada vez maior, havendo assim uma necessidade crescente em encontrar novos meios de consulta. Um dos mais empregados atualmente, principalmente em projetos para web, são as buscas por similaridade. A necessidade em encontrar novos meios de consulta se deve à grande quantidade de inconsistências causadas por erros ortográficos, abreviações, caracteres trocados, siglas entre outros. Isto faz com que um mesmo objeto seja representado de várias formas, o que dificulta a busca deste pelos meios tradicionais.
Utilizando esta técnica de maneira apropriada é possível obter resultados satisfatórios, mesmo tendo pouco ou nenhum conhecimento do conteúdo armazenado. É comum a ocorrência de dados inconsistentes principalmente quando o mesmo é digitado ou quando o sistema é integrado, seja este representado como um endereço salvo com abreviações e erros ortográficos ou quando se quer resgatar dados do SGBD. Nestes casos um operador tradicional de busca não consegue recuperar os dados devido à variação existente, já que o mesmo utiliza a comparação por igualdade. Logo este problema não fica restrito somente a endereços, mas também aos mais variados casos.
Por exemplo, numa consulta para localizar um endereço cadastrado como “Avenida Presidente Vargas”. O mesmo pode conter diversas variações como “Av. Presidente Vargas” ou “Av. Pres. Vargas”, note que todas as variações se referem ao mesmo elemento. Numa consulta tradicional se utilizássemos qualquer destas variações o endereço retornaria vazio.
Temos também vários exemplos na web de sites que utilizam o conceito de busca por similaridade. O Google é um exemplo. Basta reparar que quando é digitado algum termo, mesmo que errado, automaticamente é exibida uma sugestão para o termo, onde muitas vezes é o termo escrito de forma correta e corrigida. Além do Google temos vários outros exemplos na web. Como buscas realizadas em sites de vendas para localizar algum produto. Podemos aplicar este conceito de busca no Delphi, tornando assim as consultas mais “inteligentes”, servindo assim como um diferencial na aplicação e facilitador para o usuário. Nesse artigo utilizamos um recurso nativo do Oracle, o pacote UTL_MATCH.
Já com o operador “like”, podemoscompararcadeias de caracteres utilizando padrões de comparação(SQL WildCard) para um ou mais caracteres, contudo, a pesquisa fica restrita a digitação correta.
Esse pacote foi introduzido no Oracle 10g Release 2, mas como foi documentado posteriormente, é dito que foi oficialmente suportado somente no Oracle 11g Release 2. Contém uma variedade de funções que são úteis para testar o nível de semelhança/diferença entre cadeias de texto.
Abordamos um pouco sobre cada uma dessas funções, dando mais ênfase à função JARO_WINKLER_SIMILARITY e sua implementação no Delphi.
Introdução ao pacote UTL_MATCH
Neste pacote há quatro funções que utilizam métodos diferentes para comparar a cadeia de caracteres de origem e destino. Estes retornam uma avaliação do que seria necessário para transformar este determinado conteúdo de origem em destino. As funções são separadas em duas categorias, EDIT_DISTANCE e JARO_WINKLER, que possuem diferentes algoritmos de análise (Nota do DevMan 1).
Em 1965 um cientista russo chamado Vladimir Levenshtein, criou um algoritmo para calcular a distância ou semelhança entre duas cadeias de caracteres. O cálculo baseia-se na quantidade de operações de substituição, deleção e inserção necessárias para a cadeia de origem se transformar na cadeia de destino. O algoritmo é popularmente chamado de “distância de Levenshtein” em homenagem ao cientista russo criador do algoritmo ou também conhecido como “distância de edição” (EDIT_DISTANCE).
O algoritmo “JARO_WINKLER” é outra forma de calcular a semelhança entre duas cadeias de caracteres. Criado nos EUA para atender ao Censo, este estabelece uma métrica de distância entre duas cadeias, onde se calcula o número de caracteres comuns as duas strings e a semelhança da ordem em que se apresentam, sempre levando em conta possíveis erros humanos.
Confira outros conteúdos:
Perguntas frequentes
Nossos casos de sucesso
Eu sabia pouquíssimas coisas de programação antes de começar a estudar com vocês, fui me especializando em várias áreas e ferramentas que tinham na plataforma, e com essa bagagem consegui um estágio logo no início do meu primeiro período na faculdade.
Estudo aqui na Dev desde o meio do ano passado!
Nesse período a Dev me ajudou a crescer muito aqui no trampo.
Fui o primeiro desenvolvedor contratado pela minha
empresa. Hoje eu lidero um time de desenvolvimento!
Minha meta é continuar estudando e praticando para ser um
Full-Stack Dev!
Economizei 3 meses para assinar a plataforma e sendo sincero valeu muito a pena, pois a plataforma é bem intuitiva e muuuuito didática a metodologia de ensino. Sinto que estou EVOLUINDO a cada dia. Muito obrigado!
Nossa! Plataforma maravilhosa. To amando o curso de desenvolvimento front-end, tinha coisas que eu ainda não tinha visto. A didática é do jeito que qualquer pessoa consegue aprender. Sério, to apaixonado, adorando demais.
Adquiri o curso de vocês e logo percebi que são os melhores do Brasil. É um passo a passo incrível. Só não aprende quem não quer. Foi o melhor investimento da minha vida!
Foi um dos melhores investimentos que já fiz na vida e tenho aprendido bastante com a plataforma. Vocês estão fazendo parte da minha jornada nesse mundo da programação, irei assinar meu contrato como programador graças a plataforma.
Wanderson Oliveira
Comprei a assinatura tem uma semana, aprendi mais do que 4 meses estudando outros cursos. Exercícios práticos que não tem como não aprender, estão de parabéns!
Obrigado DevMedia, nunca presenciei uma plataforma de ensino tão presente na vida acadêmica de seus alunos, parabéns!
Eduardo Dorneles
Aprendi React na plataforma da DevMedia há cerca de 1 ano e meio... Hoje estou há 1 ano empregado trabalhando 100% com React!
Adauto Junior
Já fiz alguns cursos na área e nenhum é tão bom quanto o de vocês. Estou aprendendo muito, muito obrigado por existirem. Estão de parabéns... Espero um dia conseguir um emprego na área.