Usando o Apache Lucene para Procura de Texto

Construindo facilmente recursos de procura e índice nos aplicativos

Neste artigo, aprenda sobre o Apache Lucene, uma biblioteca de mecanismos de procura de texto cheio de recursos e de alto desempenho. Explore a arquitetura Lucene e suas APIs de núcleo. Aprenda a usar o Lucene para fazer uma procura de texto completo em toda a plataforma, efetuar indexação, exibir resultados e estender uma procura.

Amol Sonawane, Senior Staff Software Engineer, IBM

Amol SonawaneAmol Sonawane é engenheiro de software sênior e pós-graduado em tecnologia da informação do International Institute of Information Technology, Bangalore. Ele projetou e desenvolveu software para diversos domínios, dentre eles gerenciamento de cadeia de suprimento, integração de aplicativo corporativo e inteligência de negócios. Possui experiência no desenvolvimento de aplicativos usando tecnologias e estruturas J2EE (Struts e Spring). Ele mora em Pune, Índia, com sua esposa Anuja. Além de trabalhar com codificação, ele também gosta de fotografia, jogo de xadrez e quebra-cabeças.



17/Dez/2009

Introdução

O Lucene é uma biblioteca de mecanismo de procura de texto altamente escalável 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 indexação e na procura de texto. Elas podem ser usadas para criar recursos de procura para aplicativos, como clientes de e-mail, listas de correspondências, procuras da Web, procuras de banco de dados, etc. Web sites como Wikipedia, TheServerSide, jGuru e LinkedIn foram desenvolvidos com o Lucene.

O Lucene também 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 várias outras linguagens de programação, dentre elas Perl, Python, C++ e .NET. A partir de 30 de julho de 2009, a versão mais recente do Lucene na ™ linguagem de programação Java é V2.4.1.

O Lucene possui vários recursos. Ele:

  • Possui algoritmos de procura poderosos, precisos e eficientes.
  • Calcula uma pontuação para cada documento que corresponda a uma determinada consulta e retorna a maioria dos documentos relevantes classificados por essas pontuações.
  • Suporta vários tipos de consultas poderosos, como PhraseQuery, WildcardQuery, RangeQuery, FuzzyQuery, BooleanQuery e outros.
  • Suporta a análise de expressões de consulta completas digitadas pelo usuário.
  • Permite que os usuários estendam o comportamento da procura usando classificação, filtragem e análise de expressão de consulta.
  • Usa um mecanismo de bloqueio baseado em arquivo para impedir modificações de índices simultâneos.
  • Permite a procura e a indexação simultaneamente.

Construindo Aplicativos Usando o Lucene

Como mostra a Figura 1, a criação de um aplicativo de procura cheio de recursos usando o Lucene envolve, primeiramente, a indexação de dados, a procura de dados e a exibição de resultados de procura.

Figura 1. Etapas para criar aplicativos usando o Lucene
Etapas para criar aplicativos usando o Lucene

Esse artigo usa fragmentos de código 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ê também pode se familiarizar com as operações básicas de índice.


Indexando Dados

O Lucene permite indexar quaisquer dados disponíveis no formato textual. O Lucene pode ser usado quase com qualquer origem de dados contanto que as informações textuais possam ser extraídas 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 indexação de dados é disponibilizá-los em um formato de texto simples. Faça isso usando os analisadores e conversores de dados customizados.

O Processo de Indexação

A Indexação é um processo de converter os dados de texto em um formato que facilita a procura rápida. Uma analogia simples é um índice que seria localizado no final de um manual: Esse índice aponta para o local dos tópicos 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 memória como um conjunto de arquivos de índice.A maioria dos mecanismos de procura da Web usa um índice invertido. Ele permite que os usuários executem procuras rápidas por palavras-chave e localizem os documentos que correspondem a uma determinada consulta. Antes que os dados de texto sejam incluídos no índice, eles são processados por um analisador (usando um processo de análise).

Análise

Análise é a conversão dos dados de texto em uma unidade de procura fundamental, chamada de termo. Durante a análise, os dados de texto passam por várias operações: extração das palavras, remoção de palavras comuns, ignorar pontuação, redução de palavras para o formato de raiz, alteração das palavras para minúsculas, etc. A análise acontece imediatamente antes de analisar a indexação e a consulta. A análise converte os dados de texto em tokens e esses tokens são incluídos como termos no índice do Lucene.

O Lucene é fornecido com vários analisadores integrados, como o SimpleAnalyzer, o StandardAnalyzer, StopAnalyzer, SnowballAnalyzer, e outros. Eles diferem na maneira pela qual tokenizam o texto e aplicam os filtros. Conforme a análise remove as palavras antes de indexar, ela diminui o tamanho do índice, mas isso poderá ter um efeito negativo na precisão do processamento da consulta. É possível ter maior controle sobre o processo de análise ao criar analisadores customizados usando os blocos de construção básicos fornecidos pelo Lucene. A Tabela 1 mostra os analisadores integrados e como eles podem processar dados.

Tabela 1. Analisadores Integrados do Lucene
AnalisadorOperações realizadas nos dados de texto
WhitespaceAnalyzerDivide os tokens em espaço em branco
SimpleAnalyzer Divide o texto em caracteres que não sejam letras e coloca o texto em minúsculo
StopAnalyzer Remove as palavras irrelevantes (desnecessárias para procura) e coloca o texto em minúscula
StandardAnalyzer Tokeniza o texto com base em uma gramática sofisticada que reconhece endereços de e-mail, acrônimos, caracteres chinês, japonês e coreano, caracteres alfanuméricos, e outros
Coloca o texto em minúsculo e
remove palavras comuns.

Classes de Indexação de Núcleo

Diretório
Uma classe abstrata que representa o local onde os arquivos de índice são armazenados. Há duas subclasses principais normalmente usadas:
  • FSDirectory— Uma implementação do Diretório que armazena índices no sistema de arquivos real.Isso é útil para grandes índices.
  • RAMDirectory— Uma implementação que armazena todos os índices na memória. Isso é ideal para índices menores que podem ser completamente carregados na memória e destruídos quando o aplicativo encerrar. Conforme o índice é mantido na me, ele é comparadamente mais rápido.
Analisador
Conforme já falado, os analisadores são responsáveis 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.

Os analisadores padrão funcionam bem com o idioma inglês. Há vários outros analisadores no sandox Lucene, dentre eles para o chinês, japonês e coreano.

IndexDeletionPolicy
Uma interface usada para implementar uma política para customizar a exclusão de consolidações obsoletas do diretório de índice. A política de exclusão padrão é KeepOnlyLastCommitDeletionPolicy, que mantém apenas as consolidações mais recentes e remove imediatamente todas as consolidações anteriores depois que a nova consolidação for feita.
IndexWriter
Um classe que cria ou mantém um índice. Seu construtor aceita um booleano que determina se um novo índice é criado ou se um índice existente é aberto. Ele fornece métodos para incluir, excluir ou atualizar documentos no índice.

As alterações feitas no índice são inicialmente armazenadas em buffer na memória e periodicamente esvaziadas para o diretório de índice.IndexWriter Expõe vários campos que controlam como os índices são armazenados em buffer na memória e gravados no disco. As alterações feitas no índice não são visíveis no IndexReader , a menos que o método de consolidação ou de fechamento do IndexWriter seja chamado. IndexWriter cria um arquivo de bloqueio para o diretório para impedir distorção de índice devido a atualizações de índice simultâneas. IndexWriter permite que os usuários especifiquem uma política de exclusão de índice opcional.

Listagem 1. Usando o Lucene IndexWriter
//Criar instância do Diretório onde os arquivos de índice serão armazenados
Directory fsDirectory =  FSDirectory.getDirectory(indexDirectory);
/* Criar instância do analisador, que será usada para tokenizar
os dados de entrada */
Analyzer standardAnalyzer = new StandardAnalyzer();
//Criar um novo índice
booleano create = true;
//Criar a instância da política de exclusão
IndexDeletionPolicy deletionPolicy = new KeepOnlyLastCommitDeletionPolicy();
indexWriter =new IndexWriter(fsDirectory,standardAnalyzer,create,
	deletionPolicy,IndexWriter.MaxFieldLength.UNLIMITED);

Incluindo Dados em um Índice

Há duas classes envolvidas na inclusão 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 opções para especificar se um campo precisa ser indexado ou analisado e se o valor precisa ser armazenado. Essas opções podem ser transmitidas ao criar uma instância de campo. A tabela abaixo mostra os detalhes das opções de metadados de Campo .

Tabela 2. Detalhes das opções de metadados de Campo
OpçãoDescrição
Field.Store.YesUsado para armazenar o valor dos campos. Ideal para campos exibidos com o caminho de arquivo de resultados de procura — e com a URL, por exemplo.
Field.Store.No O valor de campo não é armazenado — o corpo da mensagem de e-mail, por exemplo.
Field.Index.NoIdeal para campos pouco procurados— usados com os campos armazenados, como por exemplo, caminho de arquivo.
Field.Index.ANALYZEDUsado para campos indexados e analisados — o corpo e o assunto da mensagem de e-mail, por exemplo.
Field.Index.NOT_ANALYZEDUsado para campos indexados mas não analisados Ele preserva o valor original do campo em sua totalidade — datas e nomes pessoais, por exemplo.

E um Documento é uma coleta de campos. O Lucene também suporta a impulsão de documentos e campos, que é um recurso útil quando quiser dar importância 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 inclusão de dados em um índice.

Listagem 2. Incluindo dados em um índice
/*Etapa 1. Preparar dados para indexação. 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);

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 contêm essas palavras. A criação de recursos de procura usando a API de procura do Lucene é um processo direto e fácil. Essa seção aborda as classes principais a partir da API de procura do Lucene.

Procurador

Procurador é uma classe base abstrata que possui vários métodos de procura sobrecarregadas. IndexSearcher é uma subclasse normalmente utilizada que permite procurar índices armazenados em um determinado diretório. O método Procurar retorna uma coleta ordenada de documentos classificados pelas pontuações computadas. O Lucene calcula uma pontuação de cada documento que corresponde a uma determinada consulta. IndexSearcher é um thread-safe, ou seja, uma instância única que pode ser usada por vários 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 são envolvidos na indexação, mas são 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 métodos de procura do IndexSearcher.

O Lucene é fornecido com vários tipos de implementações de consulta concretas, como TermQuery, BooleanQuery, PhraseQuery, PrefixQuery, RangeQuery, MultiTermQuery, FilteredQuery, SpanQuery, etc. A seção abaixo descreve as classe de consulta primárias a partir da API de consulta do Lucene.

TermQuery
O tipo de consulta mais básico para procurar um índice.TermQuery pode ser construído usando um termo único. O valor do termo deve fazer distinção entre maiúsculas e minúsculas, mas isso não é totalmente verdade. É importante notar que os termos transmitidos para procura devem ser consistentes com os termos produzidos pela análise de documentos, porque os analisadores executam muitas operações 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 minúsculas pelo StandardAnalyzer. Se procurarmos pela palavra em letras minúsculas "java," todos os e-mails que contiverem essa palavra no campo de assunto serão 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 são organizados de maneira lexicográfica no índice. O RangeQuery do Lucene permite que os usuários procurem termos dentro de um intervalo.O intervalo pode ser especificado usando um termo de início e um termo de encerramento, que pode ser incluído ou excluído.
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 contêm 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"));
BooleanQuery
Você pode construir consultas poderosos ao combinar qualquer número de objetos de consulta usando o BooleanQuery. Ele usa o query e uma cláusula associada a uma consulta que indica se uma consulta pode ocorrer, deve ocorrer ou não deve ocorrer. Em um BooleanQuery, o número máximo de cláusulas é restrito a 1.024, por padrão. É possível configurar o máximo de classes ao chamar o método 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 contêm uma determinada sequência de termos. PhraseQuery usa informações posicionais do termo que são armazenadas em um índice. A distância entre os termos que são considerados para serem correspondidos é chamada de slop. Por padrão, o valor do slop é zero e pode ser configurado ao chamar o método setSlop . PhraseQuery também suporta várias 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 contém architect, architecture, etc.). Dois caracteres curingas padrão são usados:
  • * para zero ou mais
  • ? para um ou mais
Pode haver uma queda de desempenho se você tentar procurar usando um padrão no início de uma consulta com caractere curinga, já que todos os termos no índice serão consultados para localizar documentos correspondentes.
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 são semelhantes a sua palavra especificada. A medida de semelhança baseia-se no algoritmo Levenshtein (editar distância). Na Listagem 9, FuzzyQuery é usado para localizar uma correspondência próxima de uma palavra que foi digitada incorretamente, como "admnistrtor," embora essa palavra não 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 usuário. Ele pode ser usado para analisar expressões de consultas inseridas pelo usuário em um objeto de consulta do Lucene, que pode ser transmitido para o método de procura do IndexSearcher.Ele pode analisar expressões de consultas completas. QueryParser converte internamente uma cadeia de consulta inserida pelo usuário em uma das subclasses de consulta concretas. É necessário 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 expressão de consulta inserida pelo usuário
QueryParser queryParser = new QueryParser("subject",new StandardAnalyzer());
// Procurar e-mails que contêm 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 referências nos resultados de procura classificados, como documentos que correspondem a uma determinada consulta. Você pode decidir o número dos principais resultados de procura que precisam ser recuperados ao especificá-lo no método de procura do IndexSearcher.A paginação 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 primárias envolvidas na recuperação dos resultados de procura são ScoreDoc e TopDocs.

ScoreDoc
Um ponteiro simples para um documento contido nos resultados de procura. Isso engloba a posição de um documento no índice e a pontuação calculada pelo Lucene.
TopDocs
Engloba o número total de resultados de procura e uma matriz de ScoreDoc.

O fragmento de código abaixo mostra como recuperar documentos contidos nos resultados de procura.

Listagem 11. Exibindo Resultados de Procura
/* O primeiro parâmetro é a consulta a ser executada e o
   segundo parâmetro 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 referências 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());	
   }

Operações Básicas de Índices

As operações básicas de índice incluem remover e impulsionar documentos.

Removendo Documentos de um Índice

Geralmente é necessário 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 páginas da Web são incluídas e as páginas da Web não-existentes precisam ser removidas. O Lucene fornece a interface IndexReader que permite executar essas operações em um índice.

IndexReader é uma classe abstrata que fornece vários métodos para acessar o índice. O Lucene refere internamente os documentos com números de documentos que podem ser alterados conforme os documentos são incluídos ou excluídos do índice. O número do documento é usado para acessar um documento no índice. IndexReader não pode ser usado para atualizar índices em um diretório para o qual o IndexWriter já está aberto. IndexReader sempre procura pela captura instantânea do índice quando ele estiver aberto. Quaisquer alterações no índice não estarão visíveis até o IndexReader ser reaberto. É importante que os aplicativos que usam o Lucene reabram os IndexReaderpara ver as atualizações de índice mais recentes.

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 exclusões no disco
indexReader.close();

Impulsionando Documentos e Campos

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

Listagem 13. Campos de Impulsão
if(subject.toLowerCase().indexOf("pune") != -1){
// 
Exibir resultados de procura que contém pune no primeiro assunto ao configurar
 o fator de impulso
subjectField.setBoost(2.2F);
}
//
Exibir resultados de procura que contêm 'job' no endereço de e-mail do remetente
if(sender.toLowerCase().indexOf("job")!=-1){	
	luceneDocument.setBoost(2.1F);
}

Estendendo a Procura

O Lucene fornece um recurso avançado chamado classificação. Você pode classificar os resultados da procura por campos que indicam a posição relativa dos documentos no índice. O campo usado para classificação deve ser indexado, mas não tokenizado. Há quatro tipos possíveis de valores de termos que podem ser colocados nos campos de classificação: integers, longs, floats ou strings.

Os resultados da procura também podem ser classificados pela ordem do índice. O Lucene classifica os resultados ao diminuir a relevância, como a pontuação calculada, por padrão. A ordem de classificação também 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);

Filtragem é um processo que restringe o espaço de procura e permite que apenas um subconjunto de documentos seja considerado para as ocorrências de procura. Você pode usar esse recurso para implementar os resultados de procura dentro de procura ou para implementar a segurança sobre os resultados de procura. O Lucene é fornecido com vários filtros integrados, como BooleanFilter, CachingWrapperFilter, ChainedFilter, DuplicateFilter, PrefixFilter, QueryWrapperFilter, RangeFilter, RemoteCachingWrapperFilter, SpanFilter, etc. Filtro pode ser transmitido para o método de procura do IndexSearcherpara filtrar documentos que correspondem aos critérios 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);

Conclusão

O Lucene, uma biblioteca de software livre muito conhecida a partir do Apache, fornece recursos de indexação e de procura poderosos para os aplicativos. Ele fornece uma API simples e fácil de usar que requer entendimento mínimo dos componentes internos de indexação e procura. Neste artigo, você aprendeu sobre a arquitetura Lucene e suas APIs principais.

O Lucene desenvolveu vários aplicativos de procura utilizados por vários Web sites e organizações famosos. Ele suporta várias outras linguagens de programação. O Lucene possui uma grande e ativa comunidade técnica do usuário. Se você está a procura de uma biblioteca de procura de software livre de alto desempenho, escalável e fácil de usar, o Apache Lucene é uma ótima escolha.


Download

DescriçãoNomeTamanho
Lucene code sampleos-apache-lucenesearch-SampleApplication.zip755KB

Recursos

Aprender

  • Saiba tudo sobre o Apache Lucene, incluindo as notícias mais recentes.
  • Lucene in Action, por Erik Hatcher e Otis Gospodnetic, é o guia oficial para o Lucene. Ele descreve como indexar os dados, incluindo tipos que você definitivamente precisa saber, como MS Word, PDF, HTML e XML. Ele ensina como procurar, classificar, filtrar e realçar os resultados de procura.
  • Para ouvir entrevistas e discussões importantes para os desenvolvedores de software, consulte os Podcasts developerWorks .
  • Mantenha-se atualizado com Webcasts e Eventos Técnicos do developerWorks.
  • Acompanhe o developerWorks no Twitter.
  • Consulte as conferências, feiras comerciais, webcasts e outros Eventos programados ao redor do mundo que são de interesse dos desenvolvedores de software livre IBM.
  • Visite a Área de Software Livre developerWorks para obter informações completas sobre instruções, ferramentas e atualizações de projeto para ajudar você a desenvolver com as tecnologias de software livre e usá-las com os produtos IBM.
  • Assista e aprenda gratuitamente sobre a IBM, conheça as tecnologias de software livre e as funções de produtos com os Demos developerWorks On demand .

Obter produtos e tecnologias

Discutir

Comentários

developerWorks: Conecte-se

Los campos obligatorios están marcados con un asterisco (*).


Precisa de um ID IBM?
Esqueceu seu ID IBM?


Esqueceu sua senha?
Alterar sua senha

Ao clicar em Enviar, você concorda com os termos e condições do developerWorks.

 


A primeira vez que você entrar no developerWorks, um perfil é criado para você. Informações no seu perfil (seu nome, país / região, e nome da empresa) é apresentado ao público e vai acompanhar qualquer conteúdo que você postar, a menos que você opte por esconder o nome da empresa. Você pode atualizar sua conta IBM a qualquer momento.

Todas as informações enviadas são seguras.

Elija su nombre para mostrar



Ao se conectar ao developerWorks pela primeira vez, é criado um perfil para você e é necessário selecionar um nome de exibição. O nome de exibição acompanhará o conteúdo que você postar no developerWorks.

Escolha um nome de exibição de 3 - 31 caracteres. Seu nome de exibição deve ser exclusivo na comunidade do developerWorks e não deve ser o seu endereço de email por motivo de privacidade.

Los campos obligatorios están marcados con un asterisco (*).

(Escolha um nome de exibição de 3 - 31 caracteres.)

Ao clicar em Enviar, você concorda com os termos e condições do developerWorks.

 


Todas as informações enviadas são seguras.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=80
Zone=Software livre, Tecnologia Java
ArticleID=457463
ArticleTitle=Usando o Apache Lucene para Procura de Texto
publish-date=12172009