Vous êtes sur la page 1sur 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

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

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

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.

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.

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.

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 2 3 4 5 6 7 8 9 10 11 12 13 1993 1993 1994 1994 1994 1995 1995 1995 1995 1995 1996 1997 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 vlo 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-apachelucenesearch/index.html> Acesso em:29/9/11 Lucene <http://www.ibm.com/developerworks/br/java/library/os-apachelucenesearch/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 palavraschave 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 emails 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 interrelacionada 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/WNprolog2.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

Vous aimerez peut-être aussi