i-Jus Busca em Diário Oficial Bruno Edson Filho Daniel Marques Oliveira José de Anchieta Caraciolo Netto Max José Lins Tímoteo Roteiro Motivação Arquitetura Básica do Lucene Componentes do sistema Estrutura do Arquivo Consultas Resultados Motivação Anchieta Contexto Necessidade de buscar informações nos Diários Oficiais do país (advogados autônomos, escritórios, empresas terceirizadas pelos escritórios, etc.) Os sites existentes são muito confusos e apresentam muita dificuldade quando se procura informações, pois são publicados como um documento inteiro ou são publicados em partes menores. Exemplos Diário Oficial de Pernambuco http://www.fisepe.pe.gov.br/cepe/diario.htm Diário Oficial da União (http://www.in.gov.br/) Diários Oficiais Eletrônicos http://ediarios.in.gov.br/ediarios/pages/seguranca/login.j sp Privados Ledj (Sistema de Leitura Eletrônica dos Diários Oficiais e da Justiça) http://www.ledj.com.br/ DOINET (Diário Oficial na Internet) Solução Um sistema com interface simples e agradável, semelhante aos sistemas de busca conhecidos (Ex: Google, Yahoo!, Radix) Busca nos Diários Oficiais Termos (frase exata e expressões boleanas) Critérios de ordenação (data de publicação ou relevância) Resultados Data de publicação Documento em cache com salientador Local do Diário Oficial Endereço da versão Oficial Arquitetura Básica do Lucene Bruno Edson Arquitetura Básica do Lucene Arquitetura Básica - Lucene Objetos de acesso à dados (acessíveis) Camada de negócios acesso aos arquivos de índices (sistema) Camada de pesquisa (parser) / Indexação 7 pacotes (org.apache.lucene.*): analisys, document, index, queryparser, search, store, util Pacotes - Lucene analysys: converter texto -> índices document: relacionada a arquivos index: relacionada aos índices queryparser: QueryParser, parser consulta search: busca pelos índices store: abstração dados (BD, arq., RAM) util: utilizado pelos outros (vetor, tabela) Tipos de Campos - Lucene Field.Keyword Field.UnIndexed Field.UnStored Field.Text Fluxo de Execução - Lucene Consulta: QueryParser: Traduzir a consulta Realiza a consulta Obtém acesso aos índices Obtém acesso aos arquivos (BD, arq., RAM) Indexação: Aquisição do documento (processamento) Análise (gera índices) Grava nos índices Grava nos arquivos (BD, arq., RAM) Componentes do Sistema Daniel Componentes do Sistema HTTrack Consulta Analisador HTML Parser da Consulta Analisador Léxico Analisador Léxico Pesquisador Indexador Índice Invertido Componentes do Sistema Analisador Léxico Converte todas as letras para minúsculas Retira pontos, barras e hífen de números de identificação concatenando as suas partes CPF, CNPJ, RG, OAB etc Retira pontos, barras, hífen e espaços presentes no meio de frases Retira acentos e cedilhas Retira stopwords Campos Existentes Título (Field.Text) Publicação (Field.Keyword) Site (Field.Keyword) Cache (Field.UnIndexed) Arquivo (Field.UnIndexed) Conteudo (Field.Text) Estrutura do Arquivo Bruno Edson Estrutura do Arquivo Estrutura de Índices Multi-índice Composto Conteúdo: Segmentos Documentos Campos Termos Escolha de estrutura de índices Cálculo do nº. de arquivos abertos Performance Multi = 15300 (índices e campos) Composto = 900 (índices) Composto é 5-10% mais lenta que o multi Composto é default. Arquivos de Índices Compostos Diferença visível Multi = 10 arq’s. Composto = 2 arq’s. Redução do número de arquivos Poucos recursos Exceto: segmentos, documentos, campos e termos. Único .csf por segmento Arquivos de Índices Compostos Exemplo: Multi: Composto: Criando um índice composto Opção default Explicitar no código Método: setUseCompound(boolean) IndexWriter writer = new IndexWriter(indexDir, new StandardAnalyzer(), true); writer.setUseCompoundFile(true); Possibilidade de troca Conversão entre estruturas Suporte durante indexação IndexWriter setUseCompoundFiles(boolean) Código: IndexWriter writer = new IndexWriter(indexDir, new StandardAnalyzer(), false); writer.setUseCompoundFile(true); writer.optimize(); writer.close(); Consultas Max Consulta Biblioteca Lucene IndexSearcher Query (e subclasses) QueryParser Hits Consulta Idéia básica de uma consulta QueryParser Query IndexSearcher Hits Document Consulta Tipos de consulta Or (padrão): termo1 termo2 Termo1 OR termo2 And: +termo1 +termo2 termo1 AND termo2 Parênteses: ... (termo1 OR termo2) AND termo3 Consulta Tipos de consulta Expressão(retirando stopwords): *: “termo1 termo2” termo1* Palavras semelhantes: termo1~ Score Tipos Publicação Relevância Score Biblioteca Lucene Métodos da classe Hits: length() doc(n) id(n) score(n) Resultados Daniel Resultados Quantidade de termos Quantidade de documentos 200.000 1800 Muitos nomes frequentes Sistema http://ijuz.no-ip.info/juri Ou http://201.8.211.225/juri Obs: o sistema está rodando no computador de Daniel (dmo), quando quiser acessar programar um horário para que ele ative o sistema Referências Gospodnetic, Otis & Hatcher, Erik. Lucene in action. Manning Publications Co, 2005. CyberNeko Tools for XNI. http://www.apache.org/~andyc/neko/doc. Jakarta Lucene. http://jakarta.apache.org/lucene. JLex: A Lexical Analyzer Generator for Java(TM). http://www.cs.princeton.edu/~appel/modern/java/JLex/. Baeza-Yates, Ricardo & Ribeiro-Neto, Berthier. Modern Information Retrieval. ACM Press, 1999. CEPE - Diário Oficial do Estado de Pernambuco. http://www.fisepe.pe.gov.br/cepe/diario.htm.