Você está na página 1de 34

FACULDADE PRESIDENTE ANTNIO CARLOS DE CONTAGEM

CURSO TECNLOGO EM ANLISE E DESENVOLVIMENTO DE SISTEMAS

Implementao de Uma Mquina de Busca:

MBText

Eliene Alves de Moura


Fernando Curvelo Volpato
Jarbas Ivon Ugarte
Rodrigo Marcone Xavier

Contagem
2 semestre de 2011
2

Eliene Alves de Moura


Fernando Curvelo Volpato
Jarbas Ivon Ugarte
Rodrigo Marcone Xavier

Implementao de Uma Mquina de Busca:

MBText

Trabalho Interdisciplinar de concluso de


Mdulo apresentado como exigncia parcial para
concluso do 5 perodo do Curso de Tecnologia
em Anlise e Desenvolvimento de Sistemas da
UNIPAC Contagem.

Prof. Orientador: RAFAEL FELIPE DUTRA DA SILVEIRA

Contagem
2. Semestre de 2011
3

SUMRIO

1 - INTRODUO
2 -OBJETIVO
3 -INTERDISCIPLINARIDADE
3.1 ARQUITETURA DE MQUINAS DE BUSCA
3.2 LINGUAGEM DE PROGRAMAO PARA WEB III
3.3 LEGISLAO APLICADA INFORMTICA
4- CONCEITOS BSICOS
4.1-O QUE UMA MQUINA DE BUSCA
4.2-PORQUE USAR UMA MQUINA DE BUSCA TEXTUAL
5- TIPOS DE MQUINAS DE BUSCA:
6-O SISTEMA DE RECUPERAO DA INFORMAO (SRI)
7- O LUCENE
5.1
5.2
5.3
8- O MBText
6.1
6.2
6.3
9- CONCLUSO
10- BIBLIOGRAFIA
9-ANEXOS
4

1-INTRODUO

A criao de uma Mquina de Busca Textual com o nome MBText, ser


desenvolvida seguindo uma sequncia de estudos e implementaes.
No primeiro momento realizar-se- o levantamento dos dados e a pesquisa
bibliogrfica e documentao para, a posteriori, viabilizar a implementao do projeto a
fim de desenvolver o software.
Visto que consiste em um trabalho acadmico e um desenvolvimento de um
produto, software, cujos prazos de seu desenvolvimento demandam certa quantidade de
tempo, o mesmo ser desenvolvido no corrente perodo. Lembrando que este projeto
consiste tambm em um trabalho acadmico desenvolvido por alunos do curso de
Anlise e Desenvolvimento de Sistemas (ADS) da UNIPAC- Contagem.
Um aspecto importante a ressaltar consiste nos softwares e linguagens de
programao utilizada para desenvolver este trabalho acadmico, aos quais so
utilizados como instrumento de aprendizagem durante o curso em questo. Os
principais so: JAVA, HTML dentre outros.
Outro aspecto a ser levado em conta consiste em observar o que este trabalho
acadmico foi desenvolvido no ltimo perodo do curso de A.D.S. , de modo que se
utilize do aprendizado de vrias conceitos de vrias disciplinas e utilizado de vrias
ferramentas aprendidas neste curto tempo de aprendizagem, pois trata-se de um
curso de curta durao (tecnlogo) mas que os conceitos aprendidos foram
aproveitados pelos alunos em questo e que deveu-se focar o tema proposto s
disciplinas do corrente perodo, limitando um pouco criatividade do corpo discente.
5

2-OBJETIVOS
Ser desenvolvido um software que ir utilizar a biblioteca LUCENE onde sero
mostrados suas funcionalidades e principais caractersticas sobre mquinas de busca.

A Mquina de Busca Textual que ser criada MBText tem por objetivo indexar
um conjunto de arquivos textuais a fim de localizar palavras e trechos dos mesmos.

Este sistema poder, tambm, ser anexado em outros softwares a serem criados
em sistemas de empresas e sites.

Portanto, outro objetivo se mostra intrnseco ao desenvolver do trabalho em si, o


desenvolver de um produto, no um produto qualquer mas um software, que possa entrar
no mercado com condies de competir no mercado , se complementado e incorporado a
sites e sistemas podendo o mesmo ser modificado, melhorado para melhor se adequar
necessidade proposta.
6

3-INTERDISCIPLINARIDADE

Conforme descrito no manual do trabalho interdisciplinar no corrente perodo:


O objetivo do trabalho interdisciplinar integrar as disciplinas
cursadas no perodo, atravs da interdisciplinaridade, de acordo com um tema
central relacionado ao eixo temtico de cada mdulo do curso. Tem o
propsito tambm de interligar e conjugar os conhecimentos tericos e
prticos discorridos pelas disciplinas e a vivncia prtica-profissional dos
docentes e alunos. (UNIPAC. 2semestre-2011)

3.1 ARQUITETURA DE MQUINAS DE BUSCA


A partir do momento que se escolheu o tema proposto que consiste em
desenvolver uma mquina de busca de palavras, fica intrnseco ao contedo da
disciplina como sendo um dos principais pilares do desenvolver deste trabalho
acadmico.

3.2 LINGUAGEM DE PROGRAMAO PARA WEB III

Desde a concepo dos programas bsicos do projeto at sua finalizao


sero utilizados conceitos e tcnicas aprendidas em ATP1 e ATP2 visto que o
conhecimento destas duas disciplinas imprescindvel ao desenvolvimento do
projeto, tais como programao bsica em Java e Portugol que viabilizaram uma
capacitao bsica para outras linguagens da programao, alm da prpria
utilizao do JAVA no projeto. Portanto fica claro que outro grande pilar de
sustentao no desenvolver deste trabalho a programao em Java viabilizado
pela disciplina ATP3.

3.3 LEGISLAO APLICADA INFORMTICA

A partir da necessidade de se registrar qualquer produto criado, incluindo


softwares, objetivando proteger os direitos de quem o criou e de evitar
apropriaes indevidas. A disciplina em questo se integra nas anteriores para
este trabalho, neste 5 perodo, cedendo textos a serem utilizados e
posteriormente objetivando o registro do software conforme orientao da
mesma, caso o mesmo possa ser utilizado de forma comercial e pblico.
7

4-Conceitos Bsicos

4.1-O que uma mquina de busca

Um motor de busca, motor de pesquisa ou mquina de busca um


sistema de software projetado para encontrar informaes armazenadas
em um sistema computacional a partir de palavras-chave indicadas pelo
utilizador, reduzindo o tempo necessrio para encontrar
informaes.(< http://pt.wikipedia.org/wiki/Motor_de_busca>Set.2011)

De modo geral um software de busca consiste em buscar um conjunto de


documentos, seja ele na web ou no. Uma Mquina de Busca dividida em 3
partes:

1. Coleta e armazenamento de documentos


2. Indexao dos mesmos
3. Processamento de consultas.

4.2- Porque criar uma mquina de busca textual?


A partir do momento que um usurio precise buscar em textos informaes
especficas no s por ttulos e/ou autor mas tambm por palavras ou frases , como por
exemplo em artigos que geralmente so algo em torno de 1500 palavras, imagine que
no banco de artigos a serem buscados h mais de um milho de artigos cadastrados, o
usurio poder usar um bom framework de busca textual ser o mais vivel pois uar o
banco de dados do operador no seria a soluo mais eficaz.

4.3-Recuperao da Informao (RI)


A Recuperao da Informao "a tarefa de encontrar documentos
relevantes a partir de um corpus ou conjunto de textos em resposta a uma
necessidade de informao de um usurio". ( )
Um dos modelos de Recuperao da Informao mais conhecido o espao
vetorial, em ingls: Vector Space Model . Este modelo usado por grandes
mquinas de busca.Um grande exemplo o GOOGLE

4.3.1 Histrico
Os primrdios da recuperao da Informao ocorreu a aproximadamente
quarenta (40) sculos atrs com os brmanes e suas escritas sumrias,
posteriormente na dcada de quarenta (40) no sculo XX foi estudada por
Bush(1941) e Weaver (1949). Em 1951 Mooers criou o termo : Recuperao
da Informao.
8

4.4-Termos utilizados para Mquina de Busca:


 Search Engine;
 Ferramenta de Busca;
 Mecanismo de Busca;
 Buscador;
 Motor de Busca;
 SRI (Sistema de Recuperao da Informao);

4.5 Estrutura

Arquitetura de uma mquina de busca


9

Etapas:

Histrico:
1 1993
2 1993

3 1994
4 1994

5 1994

6 1995

7 1995

8 1995
9 1995

10 1995

11 1996

12 1997

13 2009
10

4.4-ETAPAS DE UMA MQUINA DE BUSCA:

4.1-COLETOR:

Indica quais os domnios a serem catalogados, os tipos de servidores a entrarem


na coleta, os tipos de arquivos a serem buscados dentre outros.
Um modelo conhecido o tipo Aranha onde a web pode ser caracterizada como
um grafo direcionado onde cada URL um vrtice e os links entre elas so as arestas.

4.2-ARMAZENAMENTO:
Consiste no armazenamento de pginas de diversos formatos: html, txt, doc,
pdf, dentre outros. Atualmente o texto das figuras tambm indexado.

4.3-INDEXAO:
Consiste no retorno das informaes sobre as pginas, onde estas informaes
devero ser armazenadas de modo a serem utilizadas para responder a posteriores
perguntas de usurios.Este processo pode variar de mquina de busca para mquinas de
busca.

4.3.1-Caractersticas da indexao :
Quando a indexao feita de forma automtica, pode variar em sofisticao a
fim de melhorar a preciso de resposta, assim os documentos s serem indexados, o sero
por frequncia de palavras e frases, atribuindo ou no pesos para as posies ondem
aparecem as palavras. Como exemplo temos uma palavra no ttulo da pgina com maior
peso que uma palavra no texto. Outro exemplo consiste na utilizao de meta tags
supracitadas tambm pode ser usada nesta fase.

4.3.2-Velocidade de indexao :
O processo de indexao utiliza-se de tempo. O site www. altavista. com.br
demora em torno de 6 semanas para que uma url achada pelo SPIDER (.) ser
listada na base de dados indexada e ser encontrada, conforme Mller (1999)

4.4-CONSULTA:
Com os passos anteriores a mquina de busca capaz de receber pedidos de
busca. A partir de um pedido requerido a mquina de busca no ndice entradas que
agrupam, ou seja, casem com o pedido de busca e ordena as respostas pelo que
determina ser mais importante.

4.4.1-Modelos Clssicos para Recuperao da Informao


Modelo Booleano
Modelo Vetorial
Modelo Probabilstico

5-TIPOS DE MQUINAS DE BUSCA:

5.1-Buscadores Globais:
Este modelo busca documentos na rede e apresenta-o de forma aleatria,
dependendo da quantidade de acesso ao site, dentre outros fatores. Um exemplo o
GOOGLE.
11

5.2-Buscadores Verticais:
Este tipo realiza pesquisas especializadas, com base de dados
prpria. Est relacionado busca relativo pagamento de mensalidade ou de um valor
por clic. Exemplo: BuscaP;

5.3-Guias Locais:
Este tipo est relacionado a buscadores locais e regionais e as informaes esto
relacionadas a endereos de empresas e prestadores de servio. Geralmente so
cadastros de publicaes pagas. indicado para empresas que procuram oferecer
produtos e servios em uma regio exemplo: AcheCerto;

5.4-Guias de Busca Locais:


So buscadores de abrangncia nacional que lista as empresas e prestadores de
servios prximas ao endereo do internauta a partir de um texto digitado. A
proximidade avaliada normalmente pelo cep, Donavera.com, ou por coordenadas de
GPs.(fonte)

5.5-Diretrios de Web Sites:


Este tipo de buscador organizado por categorias e subcategorias, sua finalidade
permitir ao usurio encontrar rapidamente sites que desejar, buscando por categorias, e
no por palavras-chave , so ndices de sites.Ex: Open Directory Project;

6-O SISTEMA DE RECUPERAO DA INFORMAO (SRI)


O SRI interpreta o contedo das informaes encontradas nos documentos de
uma coleo e vai orden-los de acordo com um grau de relevncia para o usurio.

Relevncia: A recuperao de todos documentos relevantes a consulta do usurio


o objetivo do SRI e o menor nmero possvel de documentos no relevantes.

Revocao (Recall):Consiste em medidas comuns que avaliam a qualidade de um


sistema de busca e recuperao da informao, juntamente com a preciso. A revocao
mede a proporo de documentos relevantes que foram retornados como resultados de
uma consulta feita pelo usurio.
Preciso: esta mede a quantidade de documentos relevantes recuperados.

A eficincia da indexao de um documento e a eficincia da revocao e preciso so


influenciados por dois fatores importantes:

Exaustividade: Define o nmero de diferentes conceitos (tpicos) que esto


indexados;
Especificidade: Define o grau de preciso da linguagem de indexao em descrever
um dado documento.

O objetivo geral deste sistema de informao minimizar o overhead para


localizao da informao para o usurio. Para isso deve-se observar os seguintes itens:
 tempo para gerao da pergunta ;
 tempo para execuo da pergunta;
 tempo para buscar os resultados;
 tempo para organizao da resposta para ser mostrada ao usurio;
 tempo perdido para encontrar o resultado com leituras de documentos no
relevantes;
12

Indexao: Os termos de indexao so palavras-chaves de documentos que


representam uma coleo destes documentos. Estas palavras podem ser extradas dos
documentos de forma automtica ou selecionadas por especialistas, gerando de qualquer
modo uma viso lgica dos documentos.

Arquivo invertido: O Arquivo Invertido consiste em um conjunto de nmeros de


documentos contendo o termo, ou seja, uma lista invertida que aplica-se ao tipo de
ndice que aponta os documentos que contm os vrios termos de um texto, assim um
arquivo invertido mostra para cada termo do vocabulrio uma lista invertida.

So muito utilizados, devido eficincia nas buscas e possibilidade de


compresso, mas necessitam uma estrutura auxiliar: o vocabulrio ou lxico, uma lista
de todos os termos distintos que ocorrem no texto.

7-O LUCENE

O LUCENE consiste em um Framework para busca textual feito em java,


apresenta caractersticas importantes como a integrao com o Hadoop (outro
framework para computao distribuda que possui um MapReduce e um sistema de
arquivos distribudos-HDFS) .

Criado por Doug Cutting em 2000, o Lucene uma das mais famosas e mais usadas
bibliotecas para indexao e consulta de textos, disponvel em cdigo aberto. Sob o
domnio da Apache Foundation, a biblioteca, escrita em java, pode ser utilizada em
qualquer aplicativo J2SE ou J2EE, de cdigo aberto ou no. Outras linguagens como
Delphi, Perl, C#, C++, Python, Ruby , PHP e JAVA, devem usar os ports do Lucene
para as referidas linguagens. (<http://vitorpamplona.com/wiki/Introdu%C3%A7%C3%
A3o%20ao%20Apache%20Lucene>)

7.1-Como o LUCENE funciona?


Na primeira fase consiste na indexao do documento, onde o documento
analisado por um ANALIZER que j retira as STOPWORDS para ,a posteriori, ser
indexado.
Veja abaixo o cdigo:

Set stopWords = new HashSet();


stopWords.add("the");
stopWords.add("it");
stopWords.add("is");
IndexWriter writer = new IndexWriter(FSDirectory.open(INDEX_DIR),
new StandardAnalyzer(Version.LUCENE_CURRENT,stopWords),
false,IndexWriter.MaxFieldLength.LIMITED);

O Lucene permite a criao de um ndice usando o IndexWriter, que permite


dizer onde ser, ou est, o diretrio dos ndices, qual analizador ser utilizado, se ir
criar o ndice e a quantidade mxima de campos.Para indexar os documentos o
indexador necessita que haja documentos a serem indexados. Observe o cdigo abaixo:

Document doc = new Document();


doc.add(new Field("nomedocampo", "valores a serem guardados",
13

Field.Store.YES, Field.Index.NOT_ANALYZED));
doc.add(new Field("camp1","valores a serem analisados
tokenizados",Field.Store.YES, Field.Index.toIndex(true, true)));
writer.addDocument(doc);

Visto que o objetivo final de todo processo de busca textual mesmo a busca em si.

String valueToBeSearched = "red";


String index = "indexDir"; //dirotorio base do indice
IndexReader reader = IndexReader.open(FSDirectory.open(new File(index)),
true); //indexador
Searcher searcher = new IndexSearcher(reader); //pesquisador
QueryParser parser = new QueryParser(Version.LUCENE_CURRENT, field,
analyzer); //transoformador do texto em uma query
Query query = parser.parse(valueToBeSearched); //a consulta (query) em si
TopScoreDocCollector collector = TopScoreDocCollector.create(hitsPerPage,
false); //os melhores resultados
searcher.search(query, collector);
ScoreDoc[] hits = collector.topDocs().scoreDocs; //o conjunto de melhores
documentos para a consulta
int maximo = hits.length;
Document doc = searcher.doc(hits[index].doc);
String valor = doc.get("nomeDoCampo");

7.2 Recursos na busca de documentos


No Lucene Quando se faz uma pesquisa por documentos pode-se utilizar de alguns
operadores (+, -, AND, NOT, OR, * e etc.) em conjunto com o termo pesquisado ou
apenas pesquisar uma frase completa.

Exemplo : termo
Consequncia: pesquisar a palavra "termo" nos documentos indexados.

Exemplo : termo OR palavra ( == termo palavra)


Consequncia: pesquisar "termo" ou "palavra" nos documentos indexados.

Exemplo : +termo +palavra ( == termo AND palavra)


Consequncia: pesquisar "termo" e "palavra" nos documentos indexados.

Exemplo : campo:termo
Consequncia: pesquisar "termo" no campo "campo" nos documentos indexados.

Exemplo : +homer +simpsons -house


Consequncia: pesquisar documentos que contenham homer e simpsons e no tenha
house.

Exemplo : "termo exato"


Consequncia: pesquisar documentos que contenham exatamente "termo exato".

Exemplo : java*
Consequncia: pesquisar documentos que contenham palavras que comeem com java
(javadb, javanet...).
14

Exemplo : java~
Consequncia: pesquisar documentos que contenham palavras similares a java como por
ex. lava, jaba...
(fonte:.....)

Sobre o LUCENE pode-se obter mais informaes no ANEXO I

8-MB TEXT

A Mquina de Busca Textual que ser criada MBText tem por objetivo indexar
um conjunto de arquivos textuais a fim de localizar palavras e trechos dos mesmos.

Este sistema poder, tambm, ser anexado em outros softwares a serem criados
em sistemas de empresas e sites.

Portanto, outro objetivo se mostra intrnseco ao desenvolver do trabalho em si, o


desenvolver de um produto, no um produto qualquer mas um software, que possa entrar
no mercado com condies de competir no mercado , se complementado e incorporado a
sites e sistemas podendo o mesmo ser modificado, melhorado para melhor se adequar
necessidade proposta.

A desenvolver
15

9-CONCLUSO

ConclusoO Lucene, uma biblioteca de software livre muito conhecida a partir do


Apache, fornece recursos de indexao e de procura poderosos para os aplicativos. Ele
fornece uma API simples e fcil de usar que requer entendimento mnimo dos
componentes internos de indexao e procura. Neste artigo, voc aprendeu sobre a
arquitetura Lucene e suas APIs principais.

O Lucene desenvolveu vrios aplicativos de procura utilizados por vrios Web sites e
organizaes famosos. Ele suporta vrias outras linguagens de programao. O Lucene
possui uma grande e ativa comunidade tcnica do usurio. Se voc est a procura de
uma biblioteca de procura de software livre de alto desempenho, escalvel e fcil de
usar, o Apache Lucene uma tima escolha.

A partir da pesquisa bibliogrfica do tema proposto e da aprovao pelo


professor coordenador do interdisciplinar para este grupo em questo foi desenvolvido
este trabalho. Assim foi dada nfase nas disciplinas de Linguagem e programao para a
Web III, Mquina de Busca e Legislao Aplicada a Informtica, visto que no h um
tempo real (horrio especfico) para o desenvolvimento junto aos orientadores bem
como o trabalho diurno dos alunos, juntamente com o excesso de trabalhos extraclasse
dificultaram um melhor aproveitamento do tempo para viabilizar o desenvolvimento do
trabalho/projeto de forma mais criteriosa e com uma abordagem de forma a abranger
uma gama maior de contedo interdisciplinar .
Portanto espera-se dar prosseguimento ao projeto mesmo aps o curso afim de v-
lo aperfeioado, corrigido e incrementado para que possa , em futuro prximo inserido
no mercado de forma competitiva e atrativa aos olhos de seus usurios.
16

10-BIBLIOGRAFIA
UNIPAC,Universidade Presidente Antnio Carlos. Manual de Orientao do
Trabalho Interdisciplinar de Concluso de Mdulo.Unipac.2semestre2011.

MANZANO, Jos A.N.Garcia.JNIOR, Roberto A. da Costa.JAVA2 Programao de


Computadores.Guia Bsico de Introduo, Orientao e Desenvolvimento.So Paulo:
Erica. .2006.368p.

FREEMAN,Elizabeth. FREEMAN,Erick . Use a Cabea HTML com CSS e XHTML


Rio de Janeiro: AltaBooks. 2008. 2ed 616p(Traduo Betina Macdo).

SIERRA, Kato.BATES, Bert.Java.Use a Cabea!.Rio de Janeiro: AltaBooks.


2010.2ed 488p;

SOUZA, Emmanuel Cssio Oliveira. Criando textos segundo as normas da ABNT.


Scelisual, 2005. 41 p

MOREIRA.Leandro.Lucene,Um Motor de Busca Textual <http://archsofty.blogspot.


com /2009/12 /tutorial-apache-lucene-300-motor-de.html>Acesso em:26/09/11

PAMPLONA,Vitor.Introduo ao Apache Lucene <http://vitorpamplona.com>


Acesso em:26/9/11

SONAWANE,Amol.Usando o Apache Lucene Para Procura de Texto


<http://www.ibm.com/developerworks/br/java/library/os-apache-
lucenesearch/index.html> Acesso em:29/9/11

Lucene <http://www.ibm.com/developerworks/br/java/library/os-apache-
lucenesearch/index.html> Acesso em: 28/9/11

Introduo ao Apache Lucene <http://vitorpamplona.com/wiki/Introdu%C3%


A7%C3%A3o%20ao%20Apache%20Lucene>Acesso em :01/10/11

Podero ser acrescentados mais referncias

ANEXO I
17

LUCENE:
Fonte:http://www.ibm.com/developerworks/br/java/library/os-apachelucenesearch/
index.html

Introduo

O Lucene uma biblioteca de mecanismo de procura de texto altamente


escalvel e de software livre a partir do Apache Software Foundation. Voc pode usar o
Lucene em aplicativos comerciais e de software livre. As APIs poderosas do Lucene
focam principalmente na indexao e na procura de texto. Elas podem ser usadas para
criar recursos de procura para aplicativos, como clientes de e-mail, listas de
correspondncias, procuras da Web, procuras de banco de dados, etc. Web sites como
Wikipedia, TheServerSide, jGuru e LinkedIn foram desenvolvidos com o Lucene.

O Lucene tambm fornece recursos de procura para o Eclipse IDE, Nutch (o


famoso recurso de procura da Web de software livre) e empresas como IBM, AOL e
Hewlett-Packard. O Lucene suporta vrias outras linguagens de programao, dentre
elas Perl, Python, C++ e .NET. A partir de 30 de julho de 2009, a verso mais recente
do Lucene na linguagem de programao Java V2.4.1.

O Lucene possui vrios recursos. Ele:

Possui algoritmos de procura poderosos, precisos e eficientes.


Calcula uma pontuao para cada documento que corresponda a uma
determinada consulta e retorna a maioria dos documentos relevantes
classificados por essas pontuaes.
Suporta vrios tipos de consultas poderosos, como Phrase Query, Wildcard
Query, Range Query, Fuzzy Query, Boolean Query e outros.
Suporta a anlise de expresses de consulta completas digitadas pelo usurio.
Permite que os usurios estendam o comportamento da procura usando
classificao, filtragem e anlise de expresso de consulta.
Usa um mecanismo de bloqueio baseado em arquivo para impedir modificaes
de ndices simultneos.
Permite a procura e a indexao simultaneamente.

Voltar para parte superior

Construindo Aplicativos Usando o Lucene

Como mostra a Figura 1, a criao de um aplicativo de procura cheio de recursos


usando o Lucene envolve, primeiramente, a indexao de dados, a procura de dados e a
exibio de resultados de procura.
18

Figura 1. Etapas para criar aplicativos usando o Lucene

Esse artigo usa fragmentos de cdigo a partir de um aplicativo de amostra


desenvolvido com a tecnologia Java usando o Lucene V2.4.1. O aplicativo de exemplo
indexa um conjunto de documentos de e-mail armazenados nos arquivos de
propriedades e mostra como usar as APIs de consulta do Lucene para procurar um
ndice. Com esse exemplo, voc tambm pode se familiarizar com as operaes bsicas
de ndice.

Indexando Dados

O Lucene permite indexar quaisquer dados disponveis no formato textual. O


Lucene pode ser usado quase com qualquer origem de dados contanto que as
informaes textuais possam ser extradas dela. Voc pode usar o Lucene para indexar e
procurar dados armazenados em documentos HTML, Microsoft Word, arquivos PDF
e outros. A primeira etapa na indexao de dados disponibiliz-los em um formato de
texto simples. Faa isso usando os analisadores e conversores de dados customizados.

O Processo de Indexao

A Indexao um processo de converter os dados de texto em um formato que


facilita a procura rpida. Uma analogia simples um ndice que seria localizado no final
de um manual: Esse ndice aponta para o local dos tpicos que aparecem no manual.

O Lucene armazena os dados de entrada em uma estrutura de dados chamada de


ndice invertido , que armazenado no sistema de arquivos ou na memria como um
conjunto de arquivos de ndice.A maioria dos mecanismos de procura da Web usa um
ndice invertido. Ele permite que os usurios executem procuras rpidas por palavras-
chave e localizem os documentos que correspondem a uma determinada consulta. Antes
que os dados de texto sejam includos no ndice, eles so processados por um analisador
(usando um processo de anlise).
19

Anlise

Anlise a converso dos dados de texto em uma unidade de procura


fundamental, chamada de termo. Durante a anlise, os dados de texto passam por vrias
operaes: extrao das palavras, remoo de palavras comuns, ignorar pontuao,
reduo de palavras para o formato de raiz, alterao das palavras para minsculas, etc.
A anlise acontece imediatamente antes de analisar a indexao e a consulta. A anlise
converte os dados de texto em tokens e esses tokens so includos como termos no
ndice do Lucene.

O Lucene fornecido com vrios analisadores integrados, como o Simple


Analyzer, o StandardAnalyzer, StopAnalyzer, SnowballAnalyzer, e outros. Eles diferem
na maneira pela qual tokenizam o texto e aplicam os filtros. Conforme a anlise remove
as palavras antes de indexar, ela diminui o tamanho do ndice, mas isso poder ter um
efeito negativo na preciso do processamento da consulta. possvel ter maior controle
sobre o processo de anlise ao criar analisadores customizados usando os blocos de
construo bsicos fornecidos pelo Lucene. A Tabela 1 mostra os analisadores
integrados e como eles podem processar dados.

Tabela 1. Analisadores Integrados do Lucene


Analisador Operaes realizadas nos dados de texto
WhitespaceAnalyzerDivide os tokens em espao em branco
Divide o texto em caracteres que no sejam letras e coloca o texto
SimpleAnalyzer
em minsculo
Remove as palavras irrelevantes (desnecessrias para procura) e
StopAnalyzer
coloca o texto em minscula
Tokeniza o texto com base em uma gramtica sofisticada que
reconhece endereos de e-mail, acrnimos, caracteres chins,
StandardAnalyzer japons e coreano, caracteres alfanumricos, e outros
Coloca o texto em minsculo e
remove palavras comuns.

Classes de Indexao de Ncleo

Diretrio
Uma classe abstrata que representa o local onde os arquivos de ndice so
armazenados. H duas subclasses principais normalmente usadas:

FSDirectory Uma implementao do Diretrio que armazena ndices


no sistema de arquivos real.Isso til para grandes ndices.
RAMDirectory Uma implementao que armazena todos os ndices na
memria. Isso ideal para ndices menores que podem ser
completamente carregados na memria e destrudos quando o aplicativo
encerrar. Conforme o ndice mantido na me, ele comparadamente
mais rpido.

Analisador
Conforme j falado, os analisadores so responsveis por processar os
dados de texto e convert-los em tokens armazenados no ndice. IndexWriter
aceita um analisador usado para tokenizar os dados antes de serem indexados.
Para indexar o texto corretamente, use um analisador que seja apropriado para o
idioma do texto que precisa ser indexado.
20

Os analisadores padro funcionam bem com o idioma ingls. H vrios outros


analisadores no sandox Lucene, dentre eles para o chins, japons e coreano.

IndexDeletionPolicy
Uma interface usada para implementar uma poltica para customizar a
excluso de consolidaes obsoletas do diretrio de ndice. A poltica de
excluso padro KeepOnlyLastCommitDeletionPolicy, que mantm apenas as
consolidaes mais recentes e remove imediatamente todas as consolidaes
anteriores depois que a nova consolidao for feita.
IndexWriter
Um classe que cria ou mantm um ndice. Seu construtor aceita um
booleano que determina se um novo ndice criado ou se um ndice existente
aberto. Ele fornece mtodos para incluir, excluir ou atualizar documentos no
ndice.

As alteraes feitas no ndice so inicialmente armazenadas em buffer na


memria e periodicamente esvaziadas para o diretrio de ndice.IndexWriter
Expe vrios campos que controlam como os ndices so armazenados em
buffer na memria e gravados no disco. As alteraes feitas no ndice no so
visveis no IndexReader , a menos que o mtodo de consolidao ou de
fechamento do IndexWriter seja chamado. IndexWriter cria um arquivo de
bloqueio para o diretrio para impedir distoro de ndice devido a atualizaes
de ndice simultneas. IndexWriter permite que os usurios especifiquem uma
poltica de excluso de ndice opcional.

Listagem 1. Usando o Lucene IndexWriter

//Criar instncia do Diretrio onde os arquivos de ndice sero armazenados


Directory fsDirectory = FSDirectory.getDirectory(indexDirectory);
/* Criar instncia do analisador, que ser usada para tokenizar
os dados de entrada */
Analyzer standardAnalyzer = new StandardAnalyzer();
//Criar um novo ndice
booleano create = true;
//Criar a instncia da poltica de excluso
IndexDeletionPolicy deletionPolicy = new KeepOnlyLastCommitDeletionPolicy();
indexWriter =new IndexWriter(fsDirectory,standardAnalyzer,create,
deletionPolicy,IndexWriter.MaxFieldLength.UNLIMITED);

Incluindo Dados em um ndice

H duas classes envolvidas na incluso de dados de texto no ndice.

O Campo representa uma parte dos dados consultados ou recuperados na


procura. A classe Campo engloba o nome de campo e seu valor. O Lucene fornece as
opes para especificar se um campo precisa ser indexado ou analisado e se o valor
precisa ser armazenado. Essas opes podem ser transmitidas ao criar uma instncia de
campo. A tabela abaixo mostra os detalhes das opes de metadados de Campo .
21

Tabela 2. Detalhes das opes de metadados de Campo


Opo Descrio
Usado para armazenar o valor dos campos. Ideal para
Field.Store.Yes campos exibidos com o caminho de arquivo de
resultados de procura e com a URL, por exemplo.
O valor de campo no armazenado o corpo da
Field.Store.No
mensagem de e-mail, por exemplo.
Ideal para campos pouco procurados usados com os
Field.Index.No campos armazenados, como por exemplo, caminho de
arquivo.
Usado para campos indexados e analisados o corpo e
Field.Index.ANALYZED
o assunto da mensagem de e-mail, por exemplo.
Usado para campos indexados mas no analisados Ele
Field.Index.NOT_ANALYZEDpreserva o valor original do campo em sua totalidade
datas e nomes pessoais, por exemplo.

E um Documento uma coleta de campos. O Lucene tambm suporta a


impulso de documentos e campos, que um recurso til quando quiser dar importncia
a alguns dos dados indexados. Indexar um arquivo de texto envolve agrupar os dados de
texto em campos, criar um documento, preench-lo com campos e incluir o documento
no ndice usando IndexWriter.

A Listagem 2 mostra um exemplo da incluso de dados em um ndice.

Listagem 2. Incluindo dados em um ndice

/*Etapa 1. Preparar dados para indexao. Extrair dados. */

String sender = properties.getProperty("sender");


String date = properties.getProperty("date");
String subject = properties.getProperty("subject");
String message = properties.getProperty("message");
String emaildoc = file.getAbsolutePath();

/* Etapa 2. Agrupar dados nos Campos e inclu-los em um Documento */

Field senderField =
new Field("sender",sender,Field.Store.YES,Field.Index.NOT_ANALYZED);
Field emaildatefield =
new
Field("date",date,Field.Store.NO,Field.Index.NOT_ANALYZED);
Field subjectField =
new Field("subject",subject,Field.Store.YES,Field.Index.ANALYZED);
Field messagefield =
new
Field("message",message,Field.Store.NO,Field.Index.ANALYZED);
Field emailDocField =
new Field("emailDoc",emaildoc,Field.Store.YES,
Field.Index.NO);
22

Document doc = new Document();


// Incluir esses campos em um Documento Lucene
doc.add(senderField);
doc.add(emaildatefield);
doc.add(subjectField);
doc.add(messagefield);
doc.add(emailDocField);

//Etapa 3: Incluir esse documento no ndice Lucene.


indexWriter.addDocument(doc);

Procurando Dados Indexados

A procura o processo de buscar palavras no ndice e de localizar os


documentos que contm essas palavras. A criao de recursos de procura usando a API
de procura do Lucene um processo direto e fcil. Essa seo aborda as classes
principais a partir da API de procura do Lucene.

Procurador

Procurador uma classe base abstrata que possui vrios mtodos de procura
sobrecarregadas. IndexSearcher uma subclasse normalmente utilizada que permite
procurar ndices armazenados em um determinado diretrio. O mtodo Procurar retorna
uma coleta ordenada de documentos classificados pelas pontuaes computadas. O
Lucene calcula uma pontuao de cada documento que corresponde a uma determinada
consulta. IndexSearcher um thread-safe, ou seja, uma instncia nica que pode ser
usada por vrios encadeamentos simultaneamente.

Termo

Termo a unidade mais fundamental de procura. Ele composto de dois


elementos: o texto da palavra e o nome do campo no qual o texto ocorre. Os objetos do
termo so envolvidos na indexao, mas so criados pelos componentes internos do
Lucene.

Consulta e Subclasses

Consulta uma classe base abstrata para procuras. Procurar por uma palavra ou
frase especificada envolve agrup-la em um termo, incluir os termos em um objeto de
consulta e transmitir esse objeto de consulta para os mtodos de procura do Index
Searcher.

O Lucene fornecido com vrios tipos de implementaes de consulta


concretas, como TermQuery, BooleanQuery, PhraseQuery, PrefixQuery, RangeQuery,
MultiTermQuery, FilteredQuery, SpanQuery, etc. A seo abaixo descreve as classe de
consulta primrias a partir da API de consulta do Lucene.

TermQuery
O tipo de consulta mais bsico para procurar um ndice.TermQuery pode ser
construdo usando um termo nico. O valor do termo deve fazer distino entre
maisculas e minsculas, mas isso no totalmente verdade. importante notar que os
23

termos transmitidos para procura devem ser consistentes com os termos produzidos pela
anlise de documentos, porque os analisadores executam muitas operaes no texto
original antes de criar um ndice.

Por exemplo, considere o assunto de e-mail "Aberturas de tarefa para


Profissionais Java em Bangalore." Suponha que voc indexou isso usando o
StandardAnalyzer. Agora, se procurarmos por "Java" usando o TermQuery, nada ser
retornado j que o texto foi normalizado e colocado em letras minsculas pelo
StandardAnalyzer. Se procurarmos pela palavra em letras minsculas "java," todos os e-
mails que contiverem essa palavra no campo de assunto sero retornados.

Listagem 3. Procurando Usando o TermQuery

//Procurar e-mail com a palavra "java" no campo de assunto


Searcher indexSearcher = new IndexSearcher(indexDirectory);
Term term = new Term("subject","java");
Query termQuery = new TermQuery(term);
TopDocs topDocs = indexSearcher.search(termQuery,10);

RangeQuery

Voc pode procurar em um intervalo usando o RangeQuery. Todos os termos


so organizados de maneira lexicogrfica no ndice. O RangeQuery do Lucene permite
que os usurios procurem termos dentro de um intervalo.O intervalo pode ser
especificado usando um termo de incio e um termo de encerramento, que pode ser
includo ou excludo.

Listagem 4. Procurando em um Intervalo

/* RangeQuery example:Search mails from 01/06/2009 to 6/06/2009


both inclusive */
Term begin = new Term("date","20090601");
Term end = new Term("date","20090606");
Query query = new RangeQuery(begin, end, true);

PrefixQuery

Voc pode procurar usando uma palavra prefixada com o PrefixQuery, que
usado para contruir uma consulta que corresponda aos documentos que contm os
termos que iniciam com um prefixo de palavra especificada.

Listagem 5. Procurando Usando o PrefixQuery

//Procurar e-mails que possuem o campo remetente prefixado pela palavra 'job'
PrefixQuery prefixQuery = new PrefixQuery(new Term("sender","job"));
PrefixQuery query = new PrefixQuery(new Term("sender","job"));
24

BooleanQuery
Voc pode construir consultas poderosos ao combinar qualquer nmero de
objetos de consulta usando o BooleanQuery. Ele usa o query e uma clusula associada a
uma consulta que indica se uma consulta pode ocorrer, deve ocorrer ou no deve
ocorrer. Em um BooleanQuery, o nmero mximo de clusulas restrito a 1.024, por
padro. possvel configurar o mximo de classes ao chamar o mtodo
setMaxClauseCount .

Listagem 6. Procurando Usando o BooleanQuery

// Procurar e-mails que possuem 'java' e 'bangalore' no campo de assunto


Query query1 = new TermQuery(new Term("subject","java"));
Query query2 = new TermQuery(new Term("subject","bangalore"));
BooleanQuery query = new BooleanQuery();
query.add(query1,BooleanClause.Occur.MUST);
query.add(query2,BooleanClause.Occur.MUST);

PhraseQuery

Voc pode procurar por uma frase usando o PhraseQuery. Um PhraseQuery


corresponde aos documentos que contm uma determinada sequncia de termos.
PhraseQuery usa informaes posicionais do termo que so armazenadas em um ndice.
A distncia entre os termos que so considerados para serem correspondidos chamada
de slop. Por padro, o valor do slop zero e pode ser configurado ao chamar o mtodo
setSlop . PhraseQuery tambm suporta vrias frases de termos.

Listagem 7. Procurando Usando o PhraseQuery

/* Exemplo de PhraseQuery: Procurar e-mails que possuem a frase 'job opening j2ee'
no campo de assunto.*/
PhraseQuery query = new PhraseQuery();
query.setSlop(1);
query.add(new Term("subject","job"));
query.add(new Term("subject","opening"));
query.add(new Term("subject","j2ee"));

WildcardQuery
Um WildcardQuery implementa uma consulta com caractere curinga, podendo
fazer procuras como arch* (permitindo localizar documentos que contm architect,
architecture, etc.). Dois caracteres curingas padro so usados:

* para zero ou mais

? para um ou mais

Pode haver uma queda de desempenho se voc tentar procurar usando um


padro no incio de uma consulta com caractere curinga, j que todos os termos
no ndice sero consultados para localizar documentos correspondentes.
25

Listagem 8. Procurando Usando WildcardQuery

//Procurar por 'arch*'


para localizar mensagens de e-mail que possuem a palavra
'architect' no campo de assunto./
Query query = new WildcardQuery(new Term("subject","arch*"));

FuzzyQuery

Voc pode procurar por termos semelhantes com o FuzzyQuery, que


corresponde s palavras que so semelhantes a sua palavra especificada. A medida de
semelhana baseia-se no algoritmo Levenshtein (editar distncia). Na Listagem 9,
FuzzyQuery usado para localizar uma correspondncia prxima de uma palavra que
foi digitada incorretamente, como "admnistrtor," embora essa palavra no tenha sido
indexada.

Listagem 9. Procurando Usando o FuzzyQuery

/* Procurar por e-mails que possuem palavras semelhantes a 'admnistrdor' no campo de


assunto. Note que digitamos incorretamente admnistrtor aqui.*/
Query query = new FuzzyQuery(new Term("subject", "admnistrtor"));

QueryParser

QueryParser til para analisar cadeias de consultas inseridas pelo usurio. Ele
pode ser usado para analisar expresses de consultas inseridas pelo usurio em um
objeto de consulta do Lucene, que pode ser transmitido para o mtodo de procura do
IndexSearcher.Ele pode analisar expresses de consultas completas. QueryParser
converte internamente uma cadeia de consulta inserida pelo usurio em uma das
subclasses de consulta concretas. necessrio escapar caracteres especiais, como *, ?
com uma barra invertida (\). Voc pode construir consultas booleanas textualmente
usando os operadores AND, OR e NOT.

Listagem 10. Procurando por expresso de consulta inserida pelo usurio

QueryParser queryParser = new QueryParser("subject",new StandardAnalyzer());


// Procurar e-mails que contm as palavras 'job openings' and '.net' and 'pune'
Query query = queryParser.parse("job openings AND .net AND pune");

Exibindo Resultados de Procura

IndexSearcher retorna uma matriz de referncias nos resultados de procura


classificados, como documentos que correspondem a uma determinada consulta. Voc
pode decidir o nmero dos principais resultados de procura que precisam ser
recuperados ao especific-lo no mtodo de procura do IndexSearcher.A paginao
customizada pode ser criada sobre isso. Voc pode incluir um aplicativo da Web
customizado ou um aplicativo de desktop para exibir os resultados de procura. As
classes primrias envolvidas na recuperao dos resultados de procura so ScoreDoc e
TopDocs.
26

ScoreDoc

Um ponteiro simples para um documento contido nos resultados de procura. Isso


engloba a posio de um documento no ndice e a pontuao calculada pelo Lucene.

TopDocs

Engloba o nmero total de resultados de procura e uma matriz de ScoreDoc.O


fragmento de cdigo abaixo mostra como recuperar documentos contidos nos resultados
de procura.

Listagem 11. Exibindo Resultados de Procura

/* O primeiro parmetro a consulta a ser executada e o


segundo parmetro indica que nenhum dos resultados de procura ser buscado */
TopDocs topDocs = indexSearcher.search(query,20);
System.out.println("Total hits "+topDocs.totalHits);
// Obter uma matriz de referncias aos documentos correspondidos
ScoreDoc[] scoreDosArray = topDocs.scoreDocs;
for(ScoreDoc scoredoc: scoreDosArray){
//Recuperar o documento correspondido e mostrar detalhes relevantes
Document doc = indexSearcher.doc(scoredoc.doc);
System.out.println("\nSender: "+doc.getField("sender").stringValue());
System.out.println("Subject: "+doc.getField("subject").stringValue());
System.out.println("Email file location: "
+doc.getField("emailDoc").stringValue());
}

Operaes Bsicas de ndices

As operaes bsicas de ndice incluem remover e impulsionar documentos.

Removendo Documentos de um ndice

Geralmente necessrio atualizar os aplicativos com os dados mais recentes e


remover dados antigos. Por exemplo, no caso de mecanismos de procura da Web, o
ndice precisa ser atualizado regularmente conforme novas pginas da Web so
includas e as pginas da Web no-existentes precisam ser removidas. O Lucene fornece
a interface IndexReader que permite executar essas operaes em um ndice.

IndexReader uma classe abstrata que fornece vrios mtodos para acessar o
ndice. O Lucene refere internamente os documentos com nmeros de documentos que
podem ser alterados conforme os documentos so includos ou excludos do ndice. O
nmero do documento usado para acessar um documento no ndice. IndexReader no
pode ser usado para atualizar ndices em um diretrio para o qual o IndexWriter j est
aberto. IndexReader sempre procura pela captura instantnea do ndice quando ele
estiver aberto. Quaisquer alteraes no ndice no estaro visveis at o IndexReader ser
reaberto. importante que os aplicativos que usam o Lucene reabram os
IndexReaderpara ver as atualizaes de ndice mais recentes.
27

Listagem 12. Excluindo Documentos do ndice

// Excluir todos os e-mails do ndice recebidos em maio de 2009.


IndexReader indexReader = IndexReader.open(indexDirectory);
indexReader.deleteDocuments(new Term("month","05"));
//Fechar os arquivos de ndice associados e salvar as excluses no disco
indexReader.close();

Impulsionando Documentos e Campos

s vezes voc pode querer dar mais importncia a alguns dos dados indexados.
Voc pode querer fazer isso ao configurar um fator de impulso para um documento ou
campo.Por padro, todos os documentos e campos possuem o mesmo fator de impulso
padro de 1.0.

Listagem 13. Campos de Impulso


if(subject.toLowerCase().indexOf("pune") != -1){
//
Exibir resultados de procura que contm pune no primeiro assunto ao configurar
o fator de impulso
subjectField.setBoost(2.2F);
}
//
Exibir resultados de procura que contm 'job' no endereo de e-mail do remetente
if(sender.toLowerCase().indexOf("job")!=-1){
luceneDocument.setBoost(2.1F);
}

Estendendo a Procura

O Lucene fornece um recurso avanado chamado classificao. Voc pode


classificar os resultados da procura por campos que indicam a posio relativa dos
documentos no ndice. O campo usado para classificao deve ser indexado, mas no
tokenizado. H quatro tipos possveis de valores de termos que podem ser colocados
nos campos de classificao: integers, longs, floats ou strings.

Os resultados da procura tambm podem ser classificados pela ordem do ndice.


O Lucene classifica os resultados ao diminuir a relevncia, como a pontuao calculada,
por padro. A ordem de classificao tambm pode ser alterada.

Listagem 14. Classificando Resultados de Procura

/* Procurar e-mails que possuem a palavra 'job' no assunto e retornar resultados


classificados pelo e-mail do remetente em ordem decrescente.
*/
SortField sortField = new SortField("sender", true);
Sort sortBySender = new Sort(sortField);
WildcardQuery query = new WildcardQuery(new Term("subject","job*"));
TopFieldDocs topFieldDocs =
indexSearcher.search(query,null,20,sortBySender);
//Classificar por ordem de ndice
topFieldDocs = indexSearcher.search(query,null,20,Sort.INDEXORDER);
28

Filtragem um processo que restringe o espao de procura e permite que apenas


um subconjunto de documentos seja considerado para as ocorrncias de procura. Voc
pode usar esse recurso para implementar os resultados de procura dentro de procura ou
para implementar a segurana sobre os resultados de procura. O Lucene fornecido
com vrios filtros integrados, como BooleanFilter, CachingWrapperFilter,
ChainedFilter, DuplicateFilter, PrefixFilter, QueryWrapperFilter, RangeFilter,
RemoteCaching WrapperFilter, SpanFilter, etc. Filtro pode ser transmitido para o
mtodo de procura do IndexSearcherpara filtrar documentos que correspondem aos
critrios de filtragem.

Listagem 15. Filtrando Resultados de Procura


/*Filtrar os resultados para mostrar apenas os e-mails que possuem o campo
do remetente prefixado com 'jobs' */
Term prefix = new Term("sender","jobs");
Filter prefixFilter = new PrefixFilter(prefix);
WildcardQuery query = new WildcardQuery(new Term("subject","job*"));
indexSearcher.search(query,prefixFilter,20);
29
30

ANEXO II
Introduo ao Apache Lucene
Criado por Doug Cutting em 2000, o Lucene uma das mais famosas e mais
usadas bibliotecas para indexao e consulta de textos, disponvel em cdigo aberto.
Sob o domnio da Apache Foundation, a biblioteca, escrita em java, pode ser utilizada
em qualquer aplicativo J2SE ou J2EE, de cdigo aberto ou no. Outras linguagens como
Delphi, Perl, C#, C++, Python, Ruby , PHP e JAVA, devem usar os ports do Lucene
para as referidas linguagens.

A biblioteca composta por duas etapas principais: indexao e pesquisa (Figura


3.1). A indexao processa os dados originais gerando uma estrutura de dados inter-
relacionada eficiente para a pesquisa baseada em palavras-chave. A pesquisa, por sua
vez, consulta o ndice pelas palavras digitadas em uma consulta e organiza os resultados
pela similaridade do texto com a consulta.

Figura 3.1: Arquitetura do Apache Lucene. Imagem do Lucene in Action 2004.

O Lucene oferece um agradvel nvel de abstrao para um conjunto poderoso


de tcnicas baseadas no modelo Vetorial e Booleano. O desenvolvedor no precisa
conhecer rotinas e algoritmos de indexao, nem de consulta. Basta utiliz-los atravs
da API da biblioteca. Apesar da facilidade de uso, o Lucene no implementa um
webcrawler ou parsers de HTML / XML. Este processamento, se necessrio, deve ser
feito pela aplicao e repassado biblioteca por meio de instncias da classe Document
. A classe Document representa o mecanismo escolhido pelo Lucene para troca de
informaes entre a aplicao e a biblioteca. Um documento composto por campos e
estes campos por informaes. Cada campo possui sua utilidade para a aplicao e sua
importncia na pesquisa. Por exemplo, campos comuns so: o ID, que no ser
indexado, mas ser importante para que a aplicao localize o documento retornado pela
31

pesquisa; e o TEXT que conter a cadeia de caracteres a ser indexado e


analisado pela biblioteca. O resultado da consulta um conjunto de documentos
ordenado por relevncia, ou seja, os itens mais similares a consulta aparecem primeiro.

O Lucene implementa uma linguagem para consulta que proporciona pesquisas


booleanas (e.g. Luis AND Inacio AND Silva OR Lula), restritivas (e.g. + George + Rice
- eat - pudding), por campos (e.g. animal: monkey AND food: banana), por expresses
regulares (e.g. test *, te? t), consultas ponderadas (e.g. jakarta ^ 4 apache) e em range
(e.g. date: [20020101 TO 20030101]). Alm disso, ainda permite ao desenvolvedor criar
dois tipos de consultas anvanadas: (i) a fuzzy , que utiliza a distncia de Levenshtein ao
avaliar a proximidade entre a consulta e o documento, e permite informar o nvel de
similaridade mnimo, como, por exemplo, na consulta " roam ~ 0.8 "; (ii) a busca por
proximidade entre palavras, como, por exemplo, a consulta " jakarta apache " ~ 10, que
buscar todos os documentos que possuem " jakarta apache " com no mximo 10
palavras entre estas duas da consulta.

Os ndices podem ser criados em ambientes distribudos, aumentando a


performance e a escalabilidade da ferramenta. Calcula-se que o Lucene consiga indexar
cerca de 20MB de texto por minuto em um computador com um nico core de 1.5Ghz.
Os arquivos de ndices comprimidos ocupam cerca de 25% do tamanho sem
compresso.

Instalao

O download da biblioteca deve ser feito pelo endereo


http://www.apache.org/dyn/closer. cgi/lucene/java/. Aps o download, basta
descompactar o arquivo ZIP e colocar o lucene-core-X.Y.Z.jar dentro da pasta de
bibliotecas externas de seu projeto java.

Lucene em 5 minutos

Crie um projeto Java e uma classe principal com um mtodo main , onde
devero ser colocados todos os cdigos aqui apresentados. Este resumo foi baseado no
tutorial Lucene in 5 minutes.

Indexando uma base

Para criar os arquivos de ndice, basta instanciar o IndexWriter, adicionar os


documentos de sua base a ele, e fechar o arquivo. Como este um caso simples,
usaremos o ndice em memria.

// Cria o analyzador
StandardAnalyzer analyzer = new StandardAnalyzer();
// Diretrio virtual para o ndice
Directory indexDirectory = new RAMDirectory();
// Cria o arquivo com tamanho ilimitado.
IndexWriter w = new IndexWriter(indexDirectory, analyzer, true,
IndexWriter.MaxFieldLength.UNLIMITED);
// Adiciona 4 documentos.
addDoc(w, "Lucene in Action");
addDoc(w, "Lucene for Dummies");
addDoc(w, "Managing Gigabytes");
addDoc(w, "The Art of Computer Science");
32

// Fecha o arquivo.
w.close();

O mtodo addDoc cria um novo documento, adiciona um texto (text) como ttulo
deste documento e configura este ttulo para ser armazenado e analizado.

private static void addDoc(IndexWriter w, String text) throws IOException {


Document doc = new Document();
doc.add(new Field("title", text, Field.Store.YES, Field.Index.ANALYZED));
w.addDocument(doc);
}

Criando a Consulta

Agora que o ndice est pronto, podemos criar uma consulta no campo de ttulo
com o texto Lucene . Neste caso, a biblioteca deve retornar os documentos 1 e 2
como possveis respostas a esta consulta.

// Faz o parse da consulta e cria uma query do lucene.


Query q = new QueryParser("title", analyzer).parse("Lucene");

Repare que usamos o mesmo analyzer na criao do ndice e na consulta.


importante que seja o mesmo analisador nos dois processos, ou seja, se o analizador
criado para o ndice processa, por exemplo, stopwords , o analisador da consulta
tambm deve processar. Caso contrario a resposta do Lucene para as consultas pode no
ser boa.

O objeto query criado anteriormente deve ento ser repassado a um


IndexSearcher:

int maxHits = 10;


// Cria o acesso ao ndice
IndexSearcher searcher = new IndexSearcher(indexDirectory);
// Prepara a coleo de resultado
TopDocCollector collector = new TopDocCollector(maxHits);
// Faz a pesquisa
searcher.search(q, collector);
// Separa os 10 itens mais relevantes para a consulta.
ScoreDoc[] hits = collector.topDocs().scoreDocs;
Depois da consulta realizada, o TopDocCollector conter os 10 textos mais
relevantes, ordenados por similaridade em relao a consulta. Para imprimir o
resultado, basta varrer o array hits:
// Imprime os documentos retornados.
System.out.println("Found " + hits.length + " hits.");
for (int i = 0; i < hits.length; ++i) {
int docId = hits[i].doc;
Document d = searcher.doc(docId);
System.out.println((i + 1) + ". " + d.get("title"));
}
Pronto. O sistema est em funcionamento.
33

Stopwords, Stemming e Sinnimos

Remoo de Stopwords e Stemming so dois procedimentos comuns em


qualquer sistema de recuperao de informaes. Stopwords o conjunto de palavras
que no so consideradas na busca. Normalmente so palavras muito comuns do idioma
ou do domnio pesquisado. Stemming processo de reduzir as palavras sua raiz. A raiz
de uma palavra o conjunto de caracteres que est presente em todas as suas
derivaes.

Para utilizar stopwords necessrio implementar um analisador. O analisador


uma cadeia de filtros onde cada palavra passar, seja na criao do ndice ou na
consulta. A classe abaixo um analisador que filtra as stopwords importadas de um
arquivo e efetua o Porter stemming como um filtro que retorna apenas os radicais das
palavras vlidas.

public class TextAnalyzer extends Analyzer {


private final Set<String> stopWords;
private final boolean usePorterStemming;

public TextAnalyzer(Set<String> stopWords, boolean usePorterStemming) {


this.stopWords = stopWords;
this.usePorterStemming = usePorterStemming;
}

public TokenStream tokenStream(String fieldName, Reader reader) {


TokenStream result = new LowerCaseTokenizer(reader);
if (!stopWords.isEmpty()) {
result = new StopFilter(result, stopWords, true);
}
if (usePorterStemming) {
result = new PorterStemFilter(result);
}
return result;
}
}

A incluso de sinnimos na consulta do usurio um processo menos comum,


mas que pode aumentar muito a eficincia do sistema de RI. Trata-se de encontrar
documentos que utilizam termos no utilizados pelo cliente da consulta, mas que tem o
mesmo significado semntico. Para tal, ns baixamos o script para sinnimos feito em
Prolog da verso 2.0 da Wordnet (http://www.cogsci.princeton.edu/2.0/WNprolog-
2.0.tar.gz) que cria um hash map thread-safe na memria prprio para efetuar pesquisas
de sinnimos para qualquer palavra.

O script armazena os sinnimos em um grafo no direcionado. Ou seja, se B


sinnimo de A, A tambm ser sinnimo de B. No entanto, o script no garante que, se
A sinnimo de B e B sinnimo de C, A seja sinnimo de C. A carga do arquivo leva
cerca de 1,5 segundo e consome cerca de 10MB de RAM, mas s precisa ser feito uma
vez por execuo do programa. Depois de carregado, o mtodo getSynonyms (String)
retorna os sinnimos de uma palavra em lowercase em O (1).
34

Por exemplo, a entrada The earth, the skies and the space sem stemming,
sem stop words e com nmero mximo de 2 sinnimos por palavras resulta na sada
the earth world globe the skies and the space quad blank .

A classe abaixo abre o script da WordNet e o incorpora em um analisador do


Lucene. Como j foi dito, um analisador um filtro palavra a palavra. Esta classe segue
a mesma estrutura do analisador anterior para remover stopwords.

public class QueryAnalyser extends Analyzer {


private static final String WORDNET_PL_DEFAULT_FILE_PATH =
"./resources/wn_s.pl";
private static final SynonymMap synonymMap;
static {
try {
synonymMap = new SynonymMap(
new FileInputStream(WORDNET_PL_DEFAULT_FILE_PATH));
} catch (IOException e) {
throw new IllegalStateException("could not read wordnet file", e);
}
}
private final TextAnalyzer textAnalyzer;
private final int maxSynonyms;
public QueryAnalyser(TextAnalyzer textAnalyzer, int maxSynonyms) {
this.textAnalyzer = textAnalyzer;
this.maxSynonyms = maxSynonyms;
}

public TokenStream tokenStream(String fieldName, Reader reader) {


// Cria SynonimFilter do Lucene passando o mapa de sinnimos j carregado
// Retorna um stream de tokens com o original e os sinnimos.
SynonymTokenFilter tokenStream = new SynonymTokenFilter(
new LowerCaseTokenizer(reader), synonymMap, maxSynonyms);
// Trasforma a lista de tokens em String novamente.
String query = null;
try {
query = Utilities.readTokenStream(tokenStream);
} catch (IOException e) {
throw new IllegalArgumentException("problem reading given reader",e);
}
StringReader stringReader = new StringReader(query);
// Re-passa para o removedor de Stemming e Stopwords
return textAnalyzer.tokenStream(fieldName, stringReader);
}
}
______________________________________________________________________
Fonte:http://vitorpamplona.com/wiki/Introdu%C3%A7%C3%A3o%20ao%20Apache%
20Lucene

Você também pode gostar