Mini Google Open Source - O Gênesis
Antes de mais nada, para se montar um sistema de buca, é necessário um motor de busca. Escolher um motor de busca open source numa linguagem relativamente comum (algo como Java, PHP, ASP ou C++) seria o primeiro passo nessa empreitada. Tendo Java/JSP como tecnologias emergentes no desenvolvimento de sistemas web nos dias de hoje, escolhi essas ferramentas como base do meu projeto. Uma escolha visando mais o aprendizado daquilo que o mercado atualmente pede de seus profissionais. Também estou tentando usar Struts no projeto, também como objeto de aprendizado.
Para a ligação usuário/sistema era necessário escolher um servidor de aplicações que fosse compatível com Java/JSP. Nada mais óbvio que o Tomcat. Desenvolvido e mantido pela Apache Software Foundation, esse servidor web já é bastante difundido entre aqueles que desenvolvem em Java. Existem outras soluções para esse mesmo problema, como o Jetty, mas o Tomcat é a mais conhecida dentre todas elas.
Escolhidas a linguagem e o servidor de aplicações, a escolha de um motor de busca se torna mais restrita. Olhando algumas revistas sobre Java na empresa onde eu estagiava, eu encontrei uma solução interessante: o Lucene. O Lucene não é um framework, onde nós apenas extendemos classes para customizar um sistema genérico pré-existente; é uma biblioteca, na qual usamos classes para montar um sistema que supre nossas necessidades.
Esta biblioteca não extrai os dados passiveis de busca documentos quaisquer. Essa é uma tarefa que deve ser feita a parte, utilizando outras bibliotecas/frameworks. O Lucene apenas manipula os dados que lhe são fornecidos, previamente extraídos dos documentos a serem utilizados como alvo de busca, realizando uma indexação e provendo busca de modo fácil e modular. A questão principal que motiva a criação desse protótipo de sistema é: como criar um sistema de busca independente de conteúdo, ou ao menos extensível a algo próximo desse patamar?
O Lucene tem a sua abstração de documento baseada em campos. Cada campo é preenchido por conteudo texto. Já existe algumas soluções a esse respeito, como o projeto Lius. Também usa Java e Lucene, mas não é (ao meu ver) uma aplicação web. Claro que poderia se utilizar o Lius como parte de uma arquitetura MVC, mas isso iria de encontro ao meu estudo, já que programar faz parte do aprendizado. Mas a idéia é especificar os documentos suportados pelo sistema num arquivo XML, e utilizá-lo no processo de indexação e busca.
Inicialmente, meu objetivo era aprender a usar o Lucene direito, e o primeiro protótipo apenas buscava PDFs. Agora, com um pouco mais de maturidade, o sistema já foi preparado para ser genérico, ou ao menos multi-conteúdo. Ainda realiza busca apenas sobre conteúdo PDF e JPEG, mas o objetivo é, ao menos, adicionar um módulo para busca de MP3's e códigos fonte Java.