Início > Programação > Pesquisa Ortográfica Utilizando Oracle e Criteria

Pesquisa Ortográfica Utilizando Oracle e Criteria

Em e-commerces, encontrar conteúdo de forma simples e rápida é importante, pois de acordo com o site fbits, 75% dos compradores querem encontrar o que procuram na primeira pesquisa realizada, ou seja, para esse público majoritário, a existência de pesquisa avançada é irrelevante.

A ortografia é a parte da língua responsável pela grafia correta das palavras. Quando a geração de conteúdo é delegada para usuários que não se preocupam com o bom uso da língua nativa ou sequer adicionam tags ou quaisquer outras formas de classificação e sabendo que recuperar conteúdo é importante para o negócio, é necessário procurarmos uma forma de aumentar as chances de um determinado conteúdo ser encontrado.

Uma Solução

Combinando funções do Oracle e a API de Criteria é possível realizar pesquisas no banco de dados “desconsiderando” a acentuação das palavras. Por exemplo, se você fizer uma pesquisa passando a String “É você quem sabe”, dois possíveis resultados são:

1. É você quem sabe
2. E vOÇe qUÊM sÁbé

Para conseguir esses resultados, além de descartar a acentuação, você terá que transformar os caracteres armazenados em banco para maiúsculas e converter o texto pesquisado também para maiúsculas antes de realizar a pesquisa:

	private List<Frase> pesquisar(String valor) {
		String sourceChars = "âàãáÁÂÀÃéêÉÊíÍóôõÓÔÕüúÜÚÇç";
		String targetChars = "AAAAAAAAEEEEIIOOOOOOUUUUCC";
		String valorNormalizado = normalizar(valor);
		Criteria criteria = session.createCriteria(Frase.class);
		criteria = criteria.add(Restrictions.sqlRestriction("TRANSLATE(DS_FRASE, '"
				+ sourceChars + "', '" + targetChars + "') LIKE '%"
				+ valorNormalizado + "%'"));
		return criteria.list();
	}

	private String normalizar(String valor) {
		String valorNormalizado = Normalizer.normalize(valor, Normalizer.Form.NFD);
		Pattern pattern = Pattern.compile("\\p{InCombiningDiacriticalMarks}+");
		return pattern.matcher(valorNormalizado).replaceAll("").toUpperCase();
	}

Note que a simplicidade do exemplo não justifica o uso de criteria, mas no meu caso havia outras restrições adicionadas na busca. Criteria é mais flexível e elegante que as “named queries” para montar consultas dinâmicas. A função “translate” do Oracle serve para mapear uma sequência de caracteres em outra antes de realizar quaisquer outras operações no banco de dados. Além disso, antes de realizar a busca, é necessário remover a acentuação

Dessa forma, para todas as combinações abaixo, todas as afirmações abaixo são verdadeiras, pois o teste que está sendo feito sempre é algo do tipo “C é igual a C?”:

C é igual à C
C é igual à c
C é igual à Ç
C é igual à ç
c é igual à C
c é igual à c
c é igual à Ç
c é igual à ç
Ç é igual à C
Ç é igual à c
Ç é igual à Ç
Ç é igual à ç
ç é igual à C
ç é igual à c
ç é igual à Ç
ç é igual à ç

Para Saber Mais: Busca Fonética

De acordo com fbits:

Pesquisas indicam que 72% dos clientes de sites de comércio eletrônico não encontram resultados para pesquisas contendo erros de digitação. Com isso, uma possível venda deixa de existir, diminuindo a taxa de conversão da loja online.

Nunca precisei implementar um algoritmo de busca fonética, mas aumentaria muito mais as chances de um determinado conteúdo ser encontrado, pois além da ortografia, teríamos mapeados sinônimos fonéticos para cada palavra. Para criar esse dicionário, deve-se tomar cuidado com o idioma utilizado e o ramo de atividade da empresa, pois palavras homônimas podem ter significados diferentes além de não fazerem sentido para o negócio, como “bala” e “bola” em uma loja virtual que comercializa livros. Por exemplo, dada a palavra “Laser”, poderíamos ter os seguintes sinônimos: “Leiser”, “Lazer” e “Laiser”.

Referências

http://www.devmedia.com.br/remova-caracteres-acentuados-de-uma-string-em-java/17500
http://programandosemcafeina.blogspot.com.br/2007/04/caracteres-especiais-representados-em.html
http://lucaegasprieto.wordpress.com/2011/03/04/call-oracle-functions-nhibernate-criterion/
http://www.messiasbittencourt.com/337/pesquisa-hibernatejpa-ignorando-acentos-oracle/
http://blog.caelum.com.br/divisions-com-hibernate-uso-avancado-da-criteria-api/
http://www.devmedia.com.br/utilizando-uma-api-javascript-de-busca-fonetica-pra-filtragem-de-dados/28507

Anúncios
  1. Nenhum comentário ainda.
  1. No trackbacks yet.

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: