Este artigo apresenta e diferencia os dois tipos básicos de busca e recuperação de informação por nome ou descrição, a consulta e a pesquisa, e aborda técnicas e ferramentas típicas para cada caso, tomando como base banco de dados Oracle e plataforma de programação Java.

Quando se disponibiliza buscas para uma quantidade grande e diversificada de usuários, é cada vez mais frequente utilizar um nome como parâmetro de identificação para a busca, ao invés de um código.

Códigos são mais eficientes como critério de busca, porém pressupõem um grupo especializado de usuários que tenha familiaridade com estes códigos. Nome ou descrição textual é mais natural e intuitivo, por isso mais adequado para um público amplo e diversificado.

Contudo, é importante diferenciar os dois tipos de busca possíveis: a consulta e a pesquisa.

Consulta

Na consulta, o pressuposto é que o usuário sabe especificamente o que procura, e deve fornecer uma identificação o mais completa e precisa possível. Nessa situação, o objetivo da busca é ser restritiva de forma a trazer, idealmente, apenas o registro específico desejado.

Quando se trata de uma pessoa, instituição ou outro item que possua nome (ou razão social etc.) que pode ser composto (várias palavras), a identificação precisa textual é o nome completo.

Para busca por um nome completo, as ferramentas de facilidade devem apenas evitar pequenos equívocos e diferenças irrelevantes. Falando especificamente em dados armazenados em tabelas de banco de dados, em geral usa-se uma coluna ou índice de busca em que o nome completo tenha um tratamento de homogenização, como:

  • eliminar acento, cedilha e outros modificadores, convertendo para a letra simples correspondente;
  • converter todas as letras para maiúscula;
  • substituir caracteres especiais (apóstrofo, aspas etc.) por espaço em branco;
  • suprimir espaços em branco no início e no fim e espaços duplicados entre palavras.

Dependendo da situação, outros critérios mais amplos e flexíveis de homogenização podem ser usados, como:

  • eliminação de conectivos ou termos secundários como “de”, “da”, “e”, “Ltda” etc.;
  • conversão de abreviaturas e numerais para extenso como “Cia” para “Companhia”, “Ind” para “Indústria”, “15” para “quinze” etc.

A regra geral, portanto, de uma consulta por nome completo é fazer uma comparação direta do tipo:
normalizar(nome_fornecido) =? tabela de normalizar(nome_armazenado)

Técnicas ou ferramentas típicas:

1) No banco de dados, é recomendável criar uma função (procedimento armazenado / stored procedure) para realizar as operações de normalização do nome, e disponibilizar para uso geral. Uma função SQL Oracle que pode ser usada para remover acentos é TRANSLATE(), como translate(nome, 'âàãáÁÂÀÃéêÉÊíÍóôõÓÔÕüúÜÚÇç', 'AAAAAAAAEEEEIIOOOOOOUUUUCC'). É importante lembrar que nomes estrangeiros podem ter acentuações não existentes na língua portuguesa, como “ñ”, “ä”, “è” e outros. Para maiúsculas usa-se UPPER(nome), e brancos antes e depois podem ser removidos com TRIM(nome) ou LTRIM(RTRIM(nome)), e no meio com repetidos REPLACE(nome, ‘__’, ‘_’) de 2 brancos por 1, ou no Oracle 10g usando REGEXP_REPLACE(nome, ‘[[:space:]][[:space:]]+’, ‘_’).

2) Igualmente, na linguagem de programação é recomendado criar um método para normalização e torná-lo disponível para as aplicações em uma biblioteca. Em Java e outras linguagens, expressões regulares são excelentes para substituição de acentos, caracteres especiais e espaços em branco repetidos. Veja este exemplo sobre Remover acentuação.

3) Criar uma coluna adicional na tabela, como o nome completo homogenizado, e indexar e utilizar essa coluna no momento da busca, gerando a coluna dinamicamente (via gatilho) na inserção ou atualização do nome.

4) Criar um índice por função (disponível no Oracle 9i em diante) aplicando no índice a função de normalização do nome. Isso dispensa a criação de uma coluna adicional como em (3), delegando isso para o índice.

Pesquisa

Diferente da consulta, o objetivo da pesquisa é maximizar a capacidade de busca. A busca não precisa ser exata (ou quase exata), mas sim permite imprecisões, erros ou falhas.

A pesquisa tipicamente traz uma lista ou conjunto de resultados possíveis, de acordo com os critérios de busca.

O usuário não necessariamente deve conhecer previamente o que especificamente procura, muitas vezes se quer descobrir informação (e não apenas recuperar informação, como no caso da consulta).

No caso de pesquisa por nome, o caso típico é o usuário não ser obrigado a conhecer o nome completo, podendo em geral omitir ou errar partes:

  • omitir uma ou mais palavras (de um nome composto);
  • errar a grafia correta/exata;
  • permitir também expressões com o uso de símbolos “curinga” ou de lacuna/substituição, que demarcam um ou mais caracteres indefinidos ou não conhecidos (? e * em expressões regulares, ou _ e % no Oracle).

Em alguns casos, pode-se ser ainda mais tolerante na combinação de palavras fornecidas, permitindo que a ordem exata de palavras seja alternada ou até retornar resultado em que parte das palavras ou expressões procuradas exista, mas outra parte não.

Técnicas e ferramentas típicas:

1) Combinar o uso das técnicas de homogenização usadas em consulta com o uso de máscaras como _ e % e pesquisa SQL com LIKE. Esta técnica, porém, é bastante ineficiente e limitada, por isso tipicamente inadequada para o uso mais geral.

2) Usar o recurso Oracle Text do banco de dados Oracle (9i em diante), que cria índices complexos e flexíveis de pesquisa ampla em texto (full text search), do tipo árvore de pesquisa, aceita operadores e expressões complexos de
pesquisa no estilo “Google”, e tem mais uma infinidade de recursos (veja referências a seguir).

3) Usar mecanismos de busca fonética e múltiplas combinações de palavras. Nesse sentido, um artigo muito interessante da revista Mundo Java de junho/2010 (edição 41) apresenta esse tipo de técnica e o demonstra utilizando uma biblioteca Java brasileira disponível como software livre (licença GPL), desenvolvida pelo INCOR (Instituto do Coração, SP) utilizando um algoritmo fornecido pela PROCEMPA (Companhia de Processamento de Dados do Município de Porto Alegre, RS) e aperfeiçoada pela empresa P2D.

Os fontes da reportagem estão disponíveis no site da revista em http://www.mundojava.com.br/NovoSite/codigos.shtml: BuscaFonetica.rar.
E a biblioteca GPL aperfeiçoada está disponível na P2D e a original no InCor.