Considerações importantes para a construção de um bom sistema de busca

search

Busca

Quando comecei a programar, uma das minhas maiores dificuldades era como apresentar os dados em um sistema de busca sem carregar demais a página. Daí fui pesquisar informações entre diversos fóruns e descobri que existem várias formas de se resolver o problema…

Uma delas é fazer com que o retorno da busca seja paginado, desta forma é colocado um limite na consulta, permitindo que venha somente parte do retorno.

No entanto, a pesquisa por mais que seja limitada, ela varre todos os dados do seu banco, isso significa que se você tiver mais de 50.000 registros, ela vai verificar os 50.000 registros até encontrar a palavra que está sendo procurada, ou seja, o problema ainda é persistente…

Uma maneira que encontrei de resolver este problema, foi justamente a indexação da pesquisa, ou seja, em vez de rastrear todos os meus textos do banco de dados, resolvi que deveria rastrear os termos consideráveis deste texto, sendo assim, ao gravar uma informação no banco de dados. eu armazeno algumas palavras chaves que considere pertinente ao conteúdo em uma outra tabela do tipo: “tab_pesquisa”, e nesta tabela eu acrescento além dos termos, as IDs que contém os mesmos termos, desta forma eu consigo em uma única consulta dentro de uma tabela única menos carregada, encontrar todos os termos que contém nos meus diversos 50.000 registros, fazendo apenas o levantamento dos registros pelas IDs que constam nesta tabela relacional.

Observe este exemplo de comando SQL em DML abaixo de como seria feito o relacionamento da tabela:

SELECT tab_dados.*,
       tab_pesquisa.palavras_chaves
FROM   tab_dados,tab_pesquisa
ON     tab_dados.id_dados = tab_pesquisa.id_dados_fk
WHERE  tab_pesquisa.palavras_chaves LIKE '%$palavra%' LIMIT 2,10;

Outra coisa que é importante considerar em uma busca, é a reconsulta, ou seja, o refinamento da busca, assim, a pessoa que quer localizar o conteúdo pode por eventualidade querer filtrar sua busca, tornando ela mais objetiva…

A melhor forma que encontrei de fazer isso é gravando um log da consulta em uma outra tabela do tipo: “tab_pesquisado”, aquilo que foi pesquisado, junto com uma informação de tempo de cache e usuário (IP), assim ele mesmo pode remover aquilo que não interessa mais ser pesquisado, o que permite ao sistema incluir os termos já utilizados dentro da mesma query.

Além de todas essas funcionalidades, outra coisa que se deve considerar importante, é que quando o usuário digita um termo no campo de busca, o ideal é que ele tenha logo abaixo um menu com sugestões de palavras relacionadas para ele clicar, ao invés de digitar, agilizando seu processo de busca.

Uma das coisas que também é sugestivo ao usuário, é quando o retorno da busca for um grande vazio, é interessante colocar  informações do tipo, sitemap, ou experimente desfazer o refinamento de…, ou experimente digitar parte da palavra pesquisada…coisas do tipo, assim vc orienta melhor o usuário de como conseguir obter dados ao invés de retornos em branco…

Outro grande problema que tive quando fui fazer meu primeiro sistema de busca, foi como deveria utilizar as condições: “OR”, “AND”, ETC…

Assim, é evidente que o usuário que está pesquisando, ora quer encontrar mais de 1 valor, ora quer encontrar somente aquele termo com aquelas características específicas.

No primeiro usamos OR, no segundo usamos AND, e para a falta dos dois usamos OR… simples assim.

Veja como usar as duas condições (OR, e AND) …

//busca direta em todos os campos
$1a_BUSCA = "SELECT * FROM tab_dados WHERE palavra1 LIKE '%TERMO%' OR palavra2 LIKE '%TERMO%'";
//refinando
$2a_BUSCA = "SELECT * FROM tab_dados WHERE palavra1 LIKE '%TERMO%'
AND campo_refinado1 LIKE '%TERMO%' AND campo_refinado2 LIKE '%TERMO%'";

E é isso.

Deixe um Comentário

O seu endereço de email não será publicado Campos obrigatórios são marcados *

*

Você pode usar estas tags e atributos de HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>