Lucene - Guia Rápido
Lucene é um simples, mas poderoso, baseado em Java Searchbiblioteca. Ele pode ser usado em qualquer aplicativo para adicionar capacidade de pesquisa a ele. Lucene é um projeto de código aberto. É escalonável. Esta biblioteca de alto desempenho é usada para indexar e pesquisar praticamente qualquer tipo de texto. A biblioteca Lucene fornece as principais operações exigidas por qualquer aplicativo de pesquisa. Indexação e pesquisa.
Como funciona o aplicativo de pesquisa?
Um aplicativo de pesquisa executa todas ou algumas das seguintes operações -
Degrau | Título | Descrição |
---|---|---|
1 | Acquire Raw Content |
A primeira etapa de qualquer aplicativo de pesquisa é coletar o conteúdo de destino no qual o aplicativo de pesquisa deve ser conduzido. |
2 | Build the document |
A próxima etapa é construir o (s) documento (s) a partir do conteúdo bruto, que o aplicativo de pesquisa pode entender e interpretar facilmente. |
3 | Analyze the document |
Antes de iniciar o processo de indexação, o documento deve ser analisado para determinar qual parte do texto é candidata a ser indexada. Este processo é onde o documento é analisado. |
4 | Indexing the document |
Uma vez que os documentos são construídos e analisados, a próxima etapa é indexá-los para que este documento possa ser recuperado com base em certas chaves em vez de todo o conteúdo do documento. O processo de indexação é semelhante aos índices no final de um livro onde palavras comuns são mostradas com seus números de página para que essas palavras possam ser rastreadas rapidamente em vez de pesquisar o livro completo. |
5 | User Interface for Search |
Assim que um banco de dados de índices estiver pronto, o aplicativo pode fazer qualquer pesquisa. Para facilitar que um usuário faça uma pesquisa, o aplicativo deve fornecer um usuárioa mean ou a user interface onde um usuário pode inserir texto e iniciar o processo de pesquisa. |
6 | Build Query |
Depois que um usuário faz uma solicitação para pesquisar um texto, o aplicativo deve preparar um objeto Consulta usando esse texto, que pode ser usado para consultar o banco de dados de índice para obter os detalhes relevantes. |
7 | Search Query |
Usando um objeto de consulta, o banco de dados de índice é verificado para obter os detalhes relevantes e os documentos de conteúdo. |
8 | Render Results |
Assim que o resultado for recebido, o aplicativo deve decidir sobre como mostrar os resultados ao usuário usando a interface do usuário. Quanta informação deve ser mostrada à primeira vista e assim por diante. |
Além dessas operações básicas, um aplicativo de pesquisa também pode fornecer administration user interfacee ajudar os administradores do aplicativo a controlar o nível de pesquisa com base nos perfis do usuário. A análise dos resultados da pesquisa é outro aspecto importante e avançado de qualquer aplicativo de pesquisa.
O papel de Lucene no aplicativo de pesquisa
Lucene desempenha um papel nas etapas 2 a 7 mencionadas acima e fornece classes para fazer as operações necessárias. Em suma, o Lucene é o coração de qualquer aplicativo de pesquisa e fornece operações vitais relativas à indexação e pesquisa. A aquisição de conteúdo e a exibição dos resultados são deixados para a parte do aplicativo lidar.
No próximo capítulo, realizaremos um aplicativo de pesquisa simples usando a biblioteca Lucene Search.
Este tutorial irá guiá-lo sobre como preparar um ambiente de desenvolvimento para iniciar seu trabalho com o Spring Framework. Este tutorial também irá ensiná-lo a configurar JDK, Tomcat e Eclipse em sua máquina antes de configurar o Spring Framework -
Etapa 1 - Configuração do Java Development Kit (JDK)
Você pode baixar a versão mais recente do SDK do site Java da Oracle: Java SE Downloads . Você encontrará instruções para instalar o JDK nos arquivos baixados; siga as instruções fornecidas para instalar e configurar a configuração. Por fim, defina as variáveis de ambiente PATH e JAVA_HOME para se referir ao diretório que contém Java e javac, normalmente java_install_dir / bin e java_install_dir, respectivamente.
Se você estiver executando o Windows e instalou o JDK em C: \ jdk1.6.0_15, deverá colocar a seguinte linha em seu arquivo C: \ autoexec.bat.
set PATH = C:\jdk1.6.0_15\bin;%PATH%
set JAVA_HOME = C:\jdk1.6.0_15
Alternativamente, no Windows NT / 2000 / XP, você também pode clicar com o botão direito em My Computer, selecione Properties, então Advanced, então Environment Variables. Então, você atualizaria oPATH valor e pressione o OK botão.
No Unix (Solaris, Linux, etc.), se o SDK estiver instalado em /usr/local/jdk1.6.0_15 e você usar o shell C, você deve colocar o seguinte em seu arquivo .cshrc.
setenv PATH /usr/local/jdk1.6.0_15/bin:$PATH
setenv JAVA_HOME /usr/local/jdk1.6.0_15
Alternativamente, se você usar um Integrated Development Environment (IDE) como Borland JBuilder, Eclipse, IntelliJ IDEA ou Sun ONE Studio, compile e execute um programa simples para confirmar que o IDE sabe onde você instalou o Java, caso contrário, faça a configuração adequada conforme fornecido no documento do IDE.
Etapa 2 - Configuração do Eclipse IDE
Todos os exemplos neste tutorial foram escritos usando Eclipse IDE. Portanto, eu sugiro que você tenha a versão mais recente do Eclipse instalada em sua máquina.
Para instalar o Eclipse IDE, baixe os binários mais recentes do Eclipse em https://www.eclipse.org/downloads/. Depois de fazer o download da instalação, descompacte a distribuição binária em um local conveniente. Por exemplo, emC:\eclipse on windows, ou /usr/local/eclipse on Linux/Unix e finalmente defina a variável PATH apropriadamente.
O Eclipse pode ser iniciado executando os seguintes comandos na máquina Windows, ou você pode simplesmente clicar duas vezes em eclipse.exe
%C:\eclipse\eclipse.exe
O Eclipse pode ser iniciado executando os seguintes comandos na máquina Unix (Solaris, Linux, etc.) -
$/usr/local/eclipse/eclipse
Após uma inicialização bem-sucedida, ele deve exibir o seguinte resultado -
Etapa 3 - Configurar bibliotecas do Lucene Framework
Se a inicialização for bem-sucedida, você pode continuar a configurar sua estrutura Lucene. A seguir estão as etapas simples para baixar e instalar a estrutura em sua máquina.
https://archive.apache.org/dist/lucene/java/3.6.2/
Escolha se deseja instalar Lucene no Windows ou Unix e, em seguida, prossiga para a próxima etapa para baixar o arquivo .zip para Windows e o arquivo .tz para Unix.
Baixe a versão adequada dos binários da estrutura Lucene em https://archive.apache.org/dist/lucene/java/.
No momento em que escrevi este tutorial, eu baixei lucene-3.6.2.zip em minha máquina Windows e quando você descompactar o arquivo baixado, ele fornecerá a estrutura de diretório dentro de C: \ lucene-3.6.2 como segue.
Você encontrará todas as bibliotecas Lucene no diretório C:\lucene-3.6.2. Certifique-se de definir sua variável CLASSPATH neste diretório corretamente, caso contrário, você terá problemas ao executar seu aplicativo. Se você estiver usando o Eclipse, não é necessário definir CLASSPATH porque todas as configurações serão feitas por meio do Eclipse.
Depois de concluir esta última etapa, você está pronto para prosseguir para o seu primeiro exemplo Lucene, que verá no próximo capítulo.
Neste capítulo, aprenderemos a programação real com Lucene Framework. Antes de começar a escrever seu primeiro exemplo usando a estrutura Lucene, você deve se certificar de que configurou seu ambiente Lucene corretamente, conforme explicado em Lucene - tutorial Configuração de Ambiente . É recomendável que você tenha o conhecimento prático do Eclipse IDE.
Vamos agora continuar escrevendo um aplicativo de pesquisa simples que imprimirá o número de resultados de pesquisa encontrados. Também veremos a lista de índices criados durante este processo.
Etapa 1 - Criar projeto Java
A primeira etapa é criar um projeto Java simples usando Eclipse IDE. Siga a opçãoFile > New -> Project e finalmente selecione Java Projectassistente da lista de assistentes. Agora nomeie seu projeto comoLuceneFirstApplication usando a janela do assistente da seguinte forma -
Depois que seu projeto for criado com sucesso, você terá o seguinte conteúdo em seu Project Explorer -
Etapa 2 - Adicionar bibliotecas necessárias
Vamos agora adicionar a biblioteca principal do Lucene Framework em nosso projeto. Para fazer isso, clique com o botão direito no nome do seu projetoLuceneFirstApplication e depois siga a seguinte opção disponível no menu de contexto: Build Path -> Configure Build Path para exibir a janela Java Build Path da seguinte forma -
Agora usa Add External JARs botão disponível em Libraries guia para adicionar o seguinte JAR principal do diretório de instalação Lucene -
- lucene-core-3.6.2
Etapa 3 - Criar arquivos de origem
Vamos agora criar arquivos de origem reais sob o LuceneFirstApplicationprojeto. Primeiro, precisamos criar um pacote chamadocom.tutorialspoint.lucene. Para fazer isso, clique com o botão direito em src na seção do explorador de pacotes e siga a opção: New -> Package.
Em seguida, vamos criar LuceneTester.java e outras classes java sob o com.tutorialspoint.lucene pacote.
LuceneConstants.java
Esta classe é usada para fornecer várias constantes a serem usadas no aplicativo de amostra.
package com.tutorialspoint.lucene;
public class LuceneConstants {
public static final String CONTENTS = "contents";
public static final String FILE_NAME = "filename";
public static final String FILE_PATH = "filepath";
public static final int MAX_SEARCH = 10;
}
TextFileFilter.java
Esta classe é usada como um .txt file filtro.
package com.tutorialspoint.lucene;
import java.io.File;
import java.io.FileFilter;
public class TextFileFilter implements FileFilter {
@Override
public boolean accept(File pathname) {
return pathname.getName().toLowerCase().endsWith(".txt");
}
}
Indexer.java
Esta classe é usada para indexar os dados brutos para que possamos torná-los pesquisáveis usando a biblioteca Lucene.
package com.tutorialspoint.lucene;
import java.io.File;
import java.io.FileFilter;
import java.io.FileReader;
import java.io.IOException;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.CorruptIndexException;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;
public class Indexer {
private IndexWriter writer;
public Indexer(String indexDirectoryPath) throws IOException {
//this directory will contain the indexes
Directory indexDirectory =
FSDirectory.open(new File(indexDirectoryPath));
//create the indexer
writer = new IndexWriter(indexDirectory,
new StandardAnalyzer(Version.LUCENE_36),true,
IndexWriter.MaxFieldLength.UNLIMITED);
}
public void close() throws CorruptIndexException, IOException {
writer.close();
}
private Document getDocument(File file) throws IOException {
Document document = new Document();
//index file contents
Field contentField = new Field(LuceneConstants.CONTENTS, new FileReader(file));
//index file name
Field fileNameField = new Field(LuceneConstants.FILE_NAME,
file.getName(),Field.Store.YES,Field.Index.NOT_ANALYZED);
//index file path
Field filePathField = new Field(LuceneConstants.FILE_PATH,
file.getCanonicalPath(),Field.Store.YES,Field.Index.NOT_ANALYZED);
document.add(contentField);
document.add(fileNameField);
document.add(filePathField);
return document;
}
private void indexFile(File file) throws IOException {
System.out.println("Indexing "+file.getCanonicalPath());
Document document = getDocument(file);
writer.addDocument(document);
}
public int createIndex(String dataDirPath, FileFilter filter)
throws IOException {
//get all files in the data directory
File[] files = new File(dataDirPath).listFiles();
for (File file : files) {
if(!file.isDirectory()
&& !file.isHidden()
&& file.exists()
&& file.canRead()
&& filter.accept(file)
){
indexFile(file);
}
}
return writer.numDocs();
}
}
Searcher.java
Esta classe é usada para pesquisar os índices criados pelo Indexador para pesquisar o conteúdo solicitado.
package com.tutorialspoint.lucene;
import java.io.File;
import java.io.IOException;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.CorruptIndexException;
import org.apache.lucene.queryParser.ParseException;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;
public class Searcher {
IndexSearcher indexSearcher;
QueryParser queryParser;
Query query;
public Searcher(String indexDirectoryPath)
throws IOException {
Directory indexDirectory =
FSDirectory.open(new File(indexDirectoryPath));
indexSearcher = new IndexSearcher(indexDirectory);
queryParser = new QueryParser(Version.LUCENE_36,
LuceneConstants.CONTENTS,
new StandardAnalyzer(Version.LUCENE_36));
}
public TopDocs search( String searchQuery)
throws IOException, ParseException {
query = queryParser.parse(searchQuery);
return indexSearcher.search(query, LuceneConstants.MAX_SEARCH);
}
public Document getDocument(ScoreDoc scoreDoc)
throws CorruptIndexException, IOException {
return indexSearcher.doc(scoreDoc.doc);
}
public void close() throws IOException {
indexSearcher.close();
}
}
LuceneTester.java
Esta classe é usada para testar a capacidade de indexação e pesquisa da biblioteca lucene.
package com.tutorialspoint.lucene;
import java.io.IOException;
import org.apache.lucene.document.Document;
import org.apache.lucene.queryParser.ParseException;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopDocs;
public class LuceneTester {
String indexDir = "E:\\Lucene\\Index";
String dataDir = "E:\\Lucene\\Data";
Indexer indexer;
Searcher searcher;
public static void main(String[] args) {
LuceneTester tester;
try {
tester = new LuceneTester();
tester.createIndex();
tester.search("Mohan");
} catch (IOException e) {
e.printStackTrace();
} catch (ParseException e) {
e.printStackTrace();
}
}
private void createIndex() throws IOException {
indexer = new Indexer(indexDir);
int numIndexed;
long startTime = System.currentTimeMillis();
numIndexed = indexer.createIndex(dataDir, new TextFileFilter());
long endTime = System.currentTimeMillis();
indexer.close();
System.out.println(numIndexed+" File indexed, time taken: "
+(endTime-startTime)+" ms");
}
private void search(String searchQuery) throws IOException, ParseException {
searcher = new Searcher(indexDir);
long startTime = System.currentTimeMillis();
TopDocs hits = searcher.search(searchQuery);
long endTime = System.currentTimeMillis();
System.out.println(hits.totalHits +
" documents found. Time :" + (endTime - startTime));
for(ScoreDoc scoreDoc : hits.scoreDocs) {
Document doc = searcher.getDocument(scoreDoc);
System.out.println("File: "
+ doc.get(LuceneConstants.FILE_PATH));
}
searcher.close();
}
}
Etapa 4 - Criação do diretório de dados e índice
Usamos 10 arquivos de texto de record1.txt a record10.txt contendo nomes e outros detalhes dos alunos e os colocamos no diretório E:\Lucene\Data. Dados de teste . Um caminho de diretório de índice deve ser criado comoE:\Lucene\Index. Depois de executar este programa, você pode ver a lista de arquivos de índice criados nessa pasta.
Etapa 5 - Executando o programa
Depois de concluir a criação da fonte, dos dados brutos, do diretório de dados e do diretório de índice, você está pronto para compilar e executar seu programa. Para fazer isso, mantenha oLuceneTester.Java guia de arquivo ativa e use o Run opção disponível no IDE Eclipse ou use Ctrl + F11 para compilar e executar seu LuceneTesterinscrição. Se o aplicativo for executado com sucesso, ele imprimirá a seguinte mensagem no console do Eclipse IDE -
Indexing E:\Lucene\Data\record1.txt
Indexing E:\Lucene\Data\record10.txt
Indexing E:\Lucene\Data\record2.txt
Indexing E:\Lucene\Data\record3.txt
Indexing E:\Lucene\Data\record4.txt
Indexing E:\Lucene\Data\record5.txt
Indexing E:\Lucene\Data\record6.txt
Indexing E:\Lucene\Data\record7.txt
Indexing E:\Lucene\Data\record8.txt
Indexing E:\Lucene\Data\record9.txt
10 File indexed, time taken: 109 ms
1 documents found. Time :0
File: E:\Lucene\Data\record4.txt
Depois de executar o programa com sucesso, você terá o seguinte conteúdo em seu index directory -
O processo de indexação é uma das principais funcionalidades fornecidas pela Lucene. O diagrama a seguir ilustra o processo de indexação e o uso de classes.IndexWriter é o componente mais importante e central do processo de indexação.
Nós adicionamos Document(s) contendo Field(s) para IndexWriter que analisa o Document(s) usando o Analyzer e, em seguida, cria / abre / edita índices conforme necessário e os armazena / atualiza em um Directory. IndexWriter é usado para atualizar ou criar índices. Não é usado para ler índices.
Classes de indexação
A seguir está uma lista de classes comumente usadas durante o processo de indexação.
S.No. | Classe e descrição |
---|---|
1 | IndexWriter Esta classe atua como um componente principal que cria / atualiza índices durante o processo de indexação. |
2 | Diretório Esta classe representa o local de armazenamento dos índices. |
3 | Analisador Esta classe é responsável por analisar um documento e obter os tokens / palavras do texto a ser indexado. Sem a análise feita, IndexWriter não pode criar índice. |
4 | Documento Esta classe representa um documento virtual com Fields onde o Field é um objeto que pode conter o conteúdo do documento físico, seus metadados e assim por diante. O Analyzer pode compreender apenas um documento. |
5 | Campo Esta é a unidade mais baixa ou o ponto de partida do processo de indexação. Ele representa o relacionamento do par de valores-chave em que uma chave é usada para identificar o valor a ser indexado. Vamos supor que um campo usado para representar o conteúdo de um documento terá a chave como "conteúdo" e o valor pode conter parte ou todo o texto ou conteúdo numérico do documento. O Lucene pode indexar apenas texto ou conteúdo numérico. |
O processo de pesquisa é novamente uma das principais funcionalidades fornecidas pelo Lucene. Seu fluxo é semelhante ao do processo de indexação. A pesquisa básica do Lucene pode ser feita usando as seguintes classes, que também podem ser chamadas de classes básicas para todas as operações relacionadas à pesquisa.
Pesquisando Classes
A seguir está uma lista de classes comumente usadas durante o processo de pesquisa.
S.No. | Classe e descrição |
---|---|
1 | IndexSearcher Esta classe atua como um componente central que lê / pesquisa índices criados após o processo de indexação. Leva instância de diretório apontando para o local que contém os índices. |
2 | Prazo Esta classe é a unidade de pesquisa mais baixa. É semelhante ao Field no processo de indexação. |
3 | Inquerir Consulta é uma classe abstrata e contém vários métodos utilitários e é o pai de todos os tipos de consultas que Lucene usa durante o processo de pesquisa. |
4 | TermQuery TermQuery é o objeto de consulta mais comumente usado e é a base de muitas consultas complexas que o Lucene pode utilizar. |
5 | TopDocs TopDocs aponta para os primeiros N resultados de pesquisa que correspondem aos critérios de pesquisa. É um contêiner simples de indicadores para apontar para documentos que são a saída de um resultado de pesquisa. |
O processo de indexação é uma das principais funcionalidades fornecidas pela Lucene. O diagrama a seguir ilustra o processo de indexação e o uso de classes. IndexWriter é o componente principal e mais importante do processo de indexação.
Adicionamos Documento (s) contendo Campo (s) ao IndexWriter que analisa o (s) Documento (s) usando o Analisador e então cria / abre / edita índices conforme necessário e os armazena / atualiza em um Diretório . IndexWriter é usado para atualizar ou criar índices. Não é usado para ler índices.
Agora vamos mostrar um processo passo a passo para começar a entender o processo de indexação usando um exemplo básico.
Crie um documento
Crie um método para obter um documento lucene de um arquivo de texto.
Crie vários tipos de campos que são pares de valores-chave contendo chaves como nomes e valores como conteúdos a serem indexados.
Defina o campo a ser analisado ou não. No nosso caso, apenas o conteúdo deve ser analisado, pois pode conter dados como a, am, are, an etc., que não são necessários nas operações de pesquisa.
Adicione os campos recém-criados ao objeto de documento e retorne-o ao método do chamador.
private Document getDocument(File file) throws IOException {
Document document = new Document();
//index file contents
Field contentField = new Field(LuceneConstants.CONTENTS,
new FileReader(file));
//index file name
Field fileNameField = new Field(LuceneConstants.FILE_NAME,
file.getName(),
Field.Store.YES,Field.Index.NOT_ANALYZED);
//index file path
Field filePathField = new Field(LuceneConstants.FILE_PATH,
file.getCanonicalPath(),
Field.Store.YES,Field.Index.NOT_ANALYZED);
document.add(contentField);
document.add(fileNameField);
document.add(filePathField);
return document;
}
Crie um IndexWriter
A classe IndexWriter atua como um componente central que cria / atualiza índices durante o processo de indexação. Siga estas etapas para criar um IndexWriter -
Step 1 - Criar objeto de IndexWriter.
Step 2 - Crie um diretório Lucene que deve apontar para o local onde os índices devem ser armazenados.
Step 3 - Inicialize o objeto IndexWriter criado com o diretório de índice, um analisador padrão com informações de versão e outros parâmetros obrigatórios / opcionais.
private IndexWriter writer;
public Indexer(String indexDirectoryPath) throws IOException {
//this directory will contain the indexes
Directory indexDirectory =
FSDirectory.open(new File(indexDirectoryPath));
//create the indexer
writer = new IndexWriter(indexDirectory,
new StandardAnalyzer(Version.LUCENE_36),true,
IndexWriter.MaxFieldLength.UNLIMITED);
}
Iniciar processo de indexação
O programa a seguir mostra como iniciar um processo de indexação -
private void indexFile(File file) throws IOException {
System.out.println("Indexing "+file.getCanonicalPath());
Document document = getDocument(file);
writer.addDocument(document);
}
Aplicação de exemplo
Para testar o processo de indexação, precisamos criar um teste de aplicativo Lucene.
Degrau | Descrição |
---|---|
1 | Crie um projeto com um nome LuceneFirstApplication sob um pacote com.tutorialspoint.lucene conforme explicado no capítulo Lucene - Primeiro Aplicativo . Você também pode usar o projeto criado no capítulo Lucene - Primeiro Aplicativo como tal para este capítulo para entender o processo de indexação. |
2 | Crie LuceneConstants.java, TextFileFilter.java e Indexer.java conforme explicado no capítulo Lucene - Primeiro Aplicativo . Mantenha o resto dos arquivos inalterados. |
3 | Crie LuceneTester.java conforme mencionado abaixo. |
4 | Limpe e crie o aplicativo para garantir que a lógica de negócios esteja funcionando de acordo com os requisitos. |
LuceneConstants.java
Esta classe é usada para fornecer várias constantes a serem usadas no aplicativo de amostra.
package com.tutorialspoint.lucene;
public class LuceneConstants {
public static final String CONTENTS = "contents";
public static final String FILE_NAME = "filename";
public static final String FILE_PATH = "filepath";
public static final int MAX_SEARCH = 10;
}
TextFileFilter.java
Esta classe é usada como um .txt filtro de arquivo.
package com.tutorialspoint.lucene;
import java.io.File;
import java.io.FileFilter;
public class TextFileFilter implements FileFilter {
@Override
public boolean accept(File pathname) {
return pathname.getName().toLowerCase().endsWith(".txt");
}
}
Indexer.java
Esta classe é usada para indexar os dados brutos para que possamos torná-los pesquisáveis usando a biblioteca Lucene.
package com.tutorialspoint.lucene;
import java.io.File;
import java.io.FileFilter;
import java.io.FileReader;
import java.io.IOException;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.CorruptIndexException;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;
public class Indexer {
private IndexWriter writer;
public Indexer(String indexDirectoryPath) throws IOException {
//this directory will contain the indexes
Directory indexDirectory =
FSDirectory.open(new File(indexDirectoryPath));
//create the indexer
writer = new IndexWriter(indexDirectory,
new StandardAnalyzer(Version.LUCENE_36),true,
IndexWriter.MaxFieldLength.UNLIMITED);
}
public void close() throws CorruptIndexException, IOException {
writer.close();
}
private Document getDocument(File file) throws IOException {
Document document = new Document();
//index file contents
Field contentField = new Field(LuceneConstants.CONTENTS,
new FileReader(file));
//index file name
Field fileNameField = new Field(LuceneConstants.FILE_NAME,
file.getName(),
Field.Store.YES,Field.Index.NOT_ANALYZED);
//index file path
Field filePathField = new Field(LuceneConstants.FILE_PATH,
file.getCanonicalPath(),
Field.Store.YES,Field.Index.NOT_ANALYZED);
document.add(contentField);
document.add(fileNameField);
document.add(filePathField);
return document;
}
private void indexFile(File file) throws IOException {
System.out.println("Indexing "+file.getCanonicalPath());
Document document = getDocument(file);
writer.addDocument(document);
}
public int createIndex(String dataDirPath, FileFilter filter)
throws IOException {
//get all files in the data directory
File[] files = new File(dataDirPath).listFiles();
for (File file : files) {
if(!file.isDirectory()
&& !file.isHidden()
&& file.exists()
&& file.canRead()
&& filter.accept(file)
){
indexFile(file);
}
}
return writer.numDocs();
}
}
LuceneTester.java
Esta classe é usada para testar a capacidade de indexação da biblioteca Lucene.
package com.tutorialspoint.lucene;
import java.io.IOException;
public class LuceneTester {
String indexDir = "E:\\Lucene\\Index";
String dataDir = "E:\\Lucene\\Data";
Indexer indexer;
public static void main(String[] args) {
LuceneTester tester;
try {
tester = new LuceneTester();
tester.createIndex();
} catch (IOException e) {
e.printStackTrace();
}
}
private void createIndex() throws IOException {
indexer = new Indexer(indexDir);
int numIndexed;
long startTime = System.currentTimeMillis();
numIndexed = indexer.createIndex(dataDir, new TextFileFilter());
long endTime = System.currentTimeMillis();
indexer.close();
System.out.println(numIndexed+" File indexed, time taken: "
+(endTime-startTime)+" ms");
}
}
Criação de diretório de dados e índice
Usamos 10 arquivos de texto de record1.txt a record10.txt contendo nomes e outros detalhes dos alunos e os colocamos no diretório E:\Lucene\Data. Dados de teste . Um caminho de diretório de índice deve ser criado comoE:\Lucene\Index. Depois de executar este programa, você pode ver a lista de arquivos de índice criados nessa pasta.
Executando o Programa
Depois de concluir a criação da fonte, dos dados brutos, do diretório de dados e do diretório de índice, você pode continuar compilando e executando seu programa. Para fazer isso, mantenha a guia do arquivo LuceneTester.Java ativa e use oRun opção disponível no IDE Eclipse ou use Ctrl + F11 para compilar e executar seu LuceneTesterinscrição. Se o seu aplicativo for executado com êxito, ele imprimirá a seguinte mensagem no console do Eclipse IDE -
Indexing E:\Lucene\Data\record1.txt
Indexing E:\Lucene\Data\record10.txt
Indexing E:\Lucene\Data\record2.txt
Indexing E:\Lucene\Data\record3.txt
Indexing E:\Lucene\Data\record4.txt
Indexing E:\Lucene\Data\record5.txt
Indexing E:\Lucene\Data\record6.txt
Indexing E:\Lucene\Data\record7.txt
Indexing E:\Lucene\Data\record8.txt
Indexing E:\Lucene\Data\record9.txt
10 File indexed, time taken: 109 ms
Depois de executar o programa com sucesso, você terá o seguinte conteúdo em seu index directory −
Neste capítulo, discutiremos as quatro principais operações de indexação. Essas operações são úteis em vários momentos e são usadas em todo o aplicativo de pesquisa de software.
Operações de Indexação
A seguir está uma lista de operações comumente usadas durante o processo de indexação.
S.No. | Operação e descrição |
---|---|
1 | Adicionar Documento Essa operação é usada no estágio inicial do processo de indexação para criar os índices no conteúdo recém-disponível. |
2 | Documento de atualização Esta operação é usada para atualizar índices para refletir as mudanças no conteúdo atualizado. É semelhante a recriar o índice. |
3 | Apagar Documento Essa operação é usada para atualizar índices para excluir os documentos que não precisam ser indexados / pesquisados. |
4 | Opções de campo As opções de campo especificam uma forma ou controlam as maneiras pelas quais o conteúdo de um campo deve ser pesquisado. |
O processo de pesquisa é uma das principais funcionalidades fornecidas pelo Lucene. O diagrama a seguir ilustra o processo e seu uso. IndexSearcher é um dos componentes principais do processo de pesquisa.
Primeiro criamos Diretório (s) contendo índices e, em seguida, passamos para IndexSearcher, que abre o diretório usando IndexReader . Em seguida, criamos uma consulta com um termo e fazemos uma pesquisa usando IndexSearcher , passando a consulta para o pesquisador. IndexSearcher retorna um objeto TopDocs que contém os detalhes da pesquisa junto com a (s) ID (s) do documento que é o resultado da operação de pesquisa.
Vamos agora mostrar uma abordagem passo a passo e ajudá-lo a entender o processo de indexação usando um exemplo básico.
Crie um QueryParser
A classe QueryParser analisa a entrada inserida pelo usuário na consulta de formato compreensível do Lucene. Siga estas etapas para criar um QueryParser -
Step 1 - Criar objeto de QueryParser.
Step 2 - Inicialize o objeto QueryParser criado com um analisador padrão com informações de versão e nome de índice no qual esta consulta deve ser executada.
QueryParser queryParser;
public Searcher(String indexDirectoryPath) throws IOException {
queryParser = new QueryParser(Version.LUCENE_36,
LuceneConstants.CONTENTS,
new StandardAnalyzer(Version.LUCENE_36));
}
Crie um IndexSearcher
A classe IndexSearcher atua como um componente central que os índices do pesquisador são criados durante o processo de indexação. Siga estas etapas para criar um IndexSearcher -
Step 1 - Criar objeto de IndexSearcher.
Step 2 - Crie um diretório Lucene que deve apontar para o local onde os índices devem ser armazenados.
Step 3 - Inicialize o objeto IndexSearcher criado com o diretório de índice.
IndexSearcher indexSearcher;
public Searcher(String indexDirectoryPath) throws IOException {
Directory indexDirectory =
FSDirectory.open(new File(indexDirectoryPath));
indexSearcher = new IndexSearcher(indexDirectory);
}
Faça busca
Siga estas etapas para fazer a pesquisa -
Step 1 - Crie um objeto Query analisando a expressão de pesquisa por meio de QueryParser.
Step 2 - Faça uma pesquisa chamando o método IndexSearcher.search ().
Query query;
public TopDocs search( String searchQuery) throws IOException, ParseException {
query = queryParser.parse(searchQuery);
return indexSearcher.search(query, LuceneConstants.MAX_SEARCH);
}
Obtenha o documento
O programa a seguir mostra como obter o documento.
public Document getDocument(ScoreDoc scoreDoc)
throws CorruptIndexException, IOException {
return indexSearcher.doc(scoreDoc.doc);
}
Fechar IndexSearcher
O programa a seguir mostra como fechar o IndexSearcher.
public void close() throws IOException {
indexSearcher.close();
}
Aplicação de exemplo
Vamos criar um aplicativo de teste Lucene para testar o processo de pesquisa.
Degrau | Descrição |
---|---|
1 | Crie um projeto com um nome LuceneFirstApplication sob um pacote com.tutorialspoint.lucene conforme explicado no capítulo Lucene - Primeiro Aplicativo . Você também pode usar o projeto criado no capítulo Lucene - Primeiro Aplicativo como tal para este capítulo para entender o processo de pesquisa. |
2 | Crie LuceneConstants.java, TextFileFilter.java e Searcher.java conforme explicado no capítulo Lucene - Primeiro Aplicativo . Mantenha o resto dos arquivos inalterados. |
3 | Crie LuceneTester.java conforme mencionado abaixo. |
4 | Limpe e construa o aplicativo para garantir que a lógica de negócios esteja funcionando de acordo com os requisitos. |
LuceneConstants.java
Esta classe é usada para fornecer várias constantes a serem usadas no aplicativo de amostra.
package com.tutorialspoint.lucene;
public class LuceneConstants {
public static final String CONTENTS = "contents";
public static final String FILE_NAME = "filename";
public static final String FILE_PATH = "filepath";
public static final int MAX_SEARCH = 10;
}
TextFileFilter.java
Esta classe é usada como um .txt filtro de arquivo.
package com.tutorialspoint.lucene;
import java.io.File;
import java.io.FileFilter;
public class TextFileFilter implements FileFilter {
@Override
public boolean accept(File pathname) {
return pathname.getName().toLowerCase().endsWith(".txt");
}
}
Searcher.java
Esta classe é usada para ler os índices feitos em dados brutos e pesquisar dados usando a biblioteca Lucene.
package com.tutorialspoint.lucene;
import java.io.File;
import java.io.IOException;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.CorruptIndexException;
import org.apache.lucene.queryParser.ParseException;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;
public class Searcher {
IndexSearcher indexSearcher;
QueryParser queryParser;
Query query;
public Searcher(String indexDirectoryPath) throws IOException {
Directory indexDirectory =
FSDirectory.open(new File(indexDirectoryPath));
indexSearcher = new IndexSearcher(indexDirectory);
queryParser = new QueryParser(Version.LUCENE_36,
LuceneConstants.CONTENTS,
new StandardAnalyzer(Version.LUCENE_36));
}
public TopDocs search( String searchQuery)
throws IOException, ParseException {
query = queryParser.parse(searchQuery);
return indexSearcher.search(query, LuceneConstants.MAX_SEARCH);
}
public Document getDocument(ScoreDoc scoreDoc)
throws CorruptIndexException, IOException {
return indexSearcher.doc(scoreDoc.doc);
}
public void close() throws IOException {
indexSearcher.close();
}
}
LuceneTester.java
Esta classe é usada para testar a capacidade de pesquisa da biblioteca Lucene.
package com.tutorialspoint.lucene;
import java.io.IOException;
import org.apache.lucene.document.Document;
import org.apache.lucene.queryParser.ParseException;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopDocs;
public class LuceneTester {
String indexDir = "E:\\Lucene\\Index";
String dataDir = "E:\\Lucene\\Data";
Searcher searcher;
public static void main(String[] args) {
LuceneTester tester;
try {
tester = new LuceneTester();
tester.search("Mohan");
} catch (IOException e) {
e.printStackTrace();
} catch (ParseException e) {
e.printStackTrace();
}
}
private void search(String searchQuery) throws IOException, ParseException {
searcher = new Searcher(indexDir);
long startTime = System.currentTimeMillis();
TopDocs hits = searcher.search(searchQuery);
long endTime = System.currentTimeMillis();
System.out.println(hits.totalHits +
" documents found. Time :" + (endTime - startTime) +" ms");
for(ScoreDoc scoreDoc : hits.scoreDocs) {
Document doc = searcher.getDocument(scoreDoc);
System.out.println("File: "+ doc.get(LuceneConstants.FILE_PATH));
}
searcher.close();
}
}
Criação de diretório de dados e índice
Usamos 10 arquivos de texto chamados record1.txt para record10.txt contendo nomes e outros detalhes dos alunos e os colocamos no diretório E: \ Lucene \ Data. Dados de teste . Um caminho de diretório de índice deve ser criado como E: \ Lucene \ Index. Depois de executar o programa de indexação no capítuloLucene - Indexing Process, você pode ver a lista de arquivos de índice criados nessa pasta.
Executando o Programa
Depois de concluir a criação da fonte, dos dados brutos, do diretório de dados, do diretório de índice e dos índices, você pode continuar compilando e executando seu programa. Para fazer isso, mantenhaLuceneTester.Java guia de arquivo ativa e use a opção Executar disponível no Eclipse IDE ou use Ctrl + F11 para compilar e executar seu LuceneTesterapplication. Se o seu aplicativo for executado com êxito, ele imprimirá a seguinte mensagem no console do Eclipse IDE -
1 documents found. Time :29 ms
File: E:\Lucene\Data\record4.txt
Vimos no capítulo anterior Lucene - Search Operation, Lucene usa IndexSearcher para fazer pesquisas e usa o objeto Consulta criado por QueryParser como a entrada. Neste capítulo, vamos discutir vários tipos de objetos Query e as diferentes maneiras de criá-los programaticamente. A criação de diferentes tipos de objeto Consulta fornece controle sobre o tipo de pesquisa a ser feita.
Considere um caso de Pesquisa Avançada, fornecida por muitos aplicativos em que os usuários têm várias opções para limitar os resultados da pesquisa. Por meio da programação de consulta, podemos conseguir o mesmo facilmente.
A seguir está a lista de tipos de consulta que discutiremos no devido tempo.
S.No. | Classe e descrição |
---|---|
1 | TermQuery Esta classe atua como um componente principal que cria / atualiza índices durante o processo de indexação. |
2 | TermRangeQuery TermRangeQuery é usado quando uma gama de termos textuais deve ser pesquisada. |
3 | PrefixQuery PrefixQuery é usado para fazer a correspondência de documentos cujo índice começa com uma string especificada. |
4 | BooleanQuery BooleanQuery é usado para pesquisar documentos que são resultado de várias consultas usando AND, OR ou NOT operadores. |
5 | PhraseQuery A consulta de frase é usada para pesquisar documentos que contenham uma sequência particular de termos. |
6 | WildCardQuery WildcardQuery é usado para pesquisar documentos usando curingas como '*' para qualquer sequência de caracteres ,? combinando um único caractere. |
7 | FuzzyQuery FuzzyQuery é usado para pesquisar documentos usando a implementação fuzzy, que é uma pesquisa aproximada baseada no algoritmo de edição de distância. |
8 | MatchAllDocsQuery MatchAllDocsQuery como o nome sugere corresponde a todos os documentos. |
Em um de nossos capítulos anteriores, vimos que Lucene usa IndexWriter para analisar o (s) Documento (s) usando o Analyzer e, em seguida, cria / abre / edita índices conforme necessário. Neste capítulo, vamos discutir os vários tipos de objetos do Analyzer e outros objetos relevantes que são usados durante o processo de análise. Compreender o processo de Análise e como os analisadores funcionam lhe dará uma ótima visão sobre como o Lucene indexa os documentos.
A seguir está a lista de objetos que discutiremos no devido tempo.
S.No. | Classe e descrição |
---|---|
1 | Símbolo Token representa texto ou palavra em um documento com detalhes relevantes como seus metadados (posição, deslocamento inicial, deslocamento final, tipo de token e seu incremento de posição). |
2 | TokenStream TokenStream é uma saída do processo de análise e é composto por uma série de tokens. É uma classe abstrata. |
3 | Analisador Esta é uma classe base abstrata para todo e qualquer tipo de Analyzer. |
4 | WhitespaceAnalyzer Este analisador divide o texto em um documento com base em espaços em branco. |
5 | SimpleAnalyzer Este analisador divide o texto em um documento com base em caracteres que não são letras e coloca o texto em minúsculas. |
6 | StopAnalyzer Este analisador funciona como o SimpleAnalyzer e remove as palavras comuns como 'a', 'an', 'the', etc. |
7 | StandardAnalyzer Este é o analisador mais sofisticado e é capaz de lidar com nomes, endereços de e-mail, etc. Ele coloca cada token em minúsculas e remove palavras comuns e pontuações, se houver. |
Neste capítulo, examinaremos as ordens de classificação em que o Lucene fornece os resultados da pesquisa por padrão ou pode ser manipulado conforme necessário.
Classificando por Relevância
Este é o modo de classificação padrão usado pelo Lucene. Lucene fornece resultados pelo hit mais relevante no topo.
private void sortUsingRelevance(String searchQuery)
throws IOException, ParseException {
searcher = new Searcher(indexDir);
long startTime = System.currentTimeMillis();
//create a term to search file name
Term term = new Term(LuceneConstants.FILE_NAME, searchQuery);
//create the term query object
Query query = new FuzzyQuery(term);
searcher.setDefaultFieldSortScoring(true, false);
//do the search
TopDocs hits = searcher.search(query,Sort.RELEVANCE);
long endTime = System.currentTimeMillis();
System.out.println(hits.totalHits +
" documents found. Time :" + (endTime - startTime) + "ms");
for(ScoreDoc scoreDoc : hits.scoreDocs) {
Document doc = searcher.getDocument(scoreDoc);
System.out.print("Score: "+ scoreDoc.score + " ");
System.out.println("File: "+ doc.get(LuceneConstants.FILE_PATH));
}
searcher.close();
}
Classificando por IndexOrder
Este modo de classificação é usado pelo Lucene. Aqui, o primeiro documento indexado é mostrado primeiro nos resultados da pesquisa.
private void sortUsingIndex(String searchQuery)
throws IOException, ParseException {
searcher = new Searcher(indexDir);
long startTime = System.currentTimeMillis();
//create a term to search file name
Term term = new Term(LuceneConstants.FILE_NAME, searchQuery);
//create the term query object
Query query = new FuzzyQuery(term);
searcher.setDefaultFieldSortScoring(true, false);
//do the search
TopDocs hits = searcher.search(query,Sort.INDEXORDER);
long endTime = System.currentTimeMillis();
System.out.println(hits.totalHits +
" documents found. Time :" + (endTime - startTime) + "ms");
for(ScoreDoc scoreDoc : hits.scoreDocs) {
Document doc = searcher.getDocument(scoreDoc);
System.out.print("Score: "+ scoreDoc.score + " ");
System.out.println("File: "+ doc.get(LuceneConstants.FILE_PATH));
}
searcher.close();
}
Aplicação de exemplo
Vamos criar um aplicativo de teste Lucene para testar o processo de classificação.
Degrau | Descrição |
---|---|
1 | Crie um projeto com um nome LuceneFirstApplication sob um pacote com.tutorialspoint.lucene conforme explicado no capítulo Lucene - Primeiro Aplicativo . Você também pode usar o projeto criado no capítulo Lucene - Primeiro Aplicativo como tal para este capítulo para entender o processo de pesquisa. |
2 | Crie LuceneConstants.java e Searcher.java conforme explicado no capítulo Lucene - Primeiro Aplicativo . Mantenha o resto dos arquivos inalterados. |
3 | Crie LuceneTester.java conforme mencionado abaixo. |
4 | Limpe e crie o aplicativo para garantir que a lógica de negócios esteja funcionando de acordo com os requisitos. |
LuceneConstants.java
Esta classe é usada para fornecer várias constantes a serem usadas no aplicativo de amostra.
package com.tutorialspoint.lucene;
public class LuceneConstants {
public static final String CONTENTS = "contents";
public static final String FILE_NAME = "filename";
public static final String FILE_PATH = "filepath";
public static final int MAX_SEARCH = 10;
}
Searcher.java
Esta classe é usada para ler os índices feitos em dados brutos e pesquisar dados usando a biblioteca Lucene.
package com.tutorialspoint.lucene;
import java.io.File;
import java.io.IOException;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.CorruptIndexException;
import org.apache.lucene.queryParser.ParseException;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.Sort;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;
public class Searcher {
IndexSearcher indexSearcher;
QueryParser queryParser;
Query query;
public Searcher(String indexDirectoryPath) throws IOException {
Directory indexDirectory
= FSDirectory.open(new File(indexDirectoryPath));
indexSearcher = new IndexSearcher(indexDirectory);
queryParser = new QueryParser(Version.LUCENE_36,
LuceneConstants.CONTENTS,
new StandardAnalyzer(Version.LUCENE_36));
}
public TopDocs search( String searchQuery)
throws IOException, ParseException {
query = queryParser.parse(searchQuery);
return indexSearcher.search(query, LuceneConstants.MAX_SEARCH);
}
public TopDocs search(Query query)
throws IOException, ParseException {
return indexSearcher.search(query, LuceneConstants.MAX_SEARCH);
}
public TopDocs search(Query query,Sort sort)
throws IOException, ParseException {
return indexSearcher.search(query,
LuceneConstants.MAX_SEARCH,sort);
}
public void setDefaultFieldSortScoring(boolean doTrackScores,
boolean doMaxScores) {
indexSearcher.setDefaultFieldSortScoring(
doTrackScores,doMaxScores);
}
public Document getDocument(ScoreDoc scoreDoc)
throws CorruptIndexException, IOException {
return indexSearcher.doc(scoreDoc.doc);
}
public void close() throws IOException {
indexSearcher.close();
}
}
LuceneTester.java
Esta classe é usada para testar a capacidade de pesquisa da biblioteca Lucene.
package com.tutorialspoint.lucene;
import java.io.IOException;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.Term;
import org.apache.lucene.queryParser.ParseException;
import org.apache.lucene.search.FuzzyQuery;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.Sort;
import org.apache.lucene.search.TopDocs;
public class LuceneTester {
String indexDir = "E:\\Lucene\\Index";
String dataDir = "E:\\Lucene\\Data";
Indexer indexer;
Searcher searcher;
public static void main(String[] args) {
LuceneTester tester;
try {
tester = new LuceneTester();
tester.sortUsingRelevance("cord3.txt");
tester.sortUsingIndex("cord3.txt");
} catch (IOException e) {
e.printStackTrace();
} catch (ParseException e) {
e.printStackTrace();
}
}
private void sortUsingRelevance(String searchQuery)
throws IOException, ParseException {
searcher = new Searcher(indexDir);
long startTime = System.currentTimeMillis();
//create a term to search file name
Term term = new Term(LuceneConstants.FILE_NAME, searchQuery);
//create the term query object
Query query = new FuzzyQuery(term);
searcher.setDefaultFieldSortScoring(true, false);
//do the search
TopDocs hits = searcher.search(query,Sort.RELEVANCE);
long endTime = System.currentTimeMillis();
System.out.println(hits.totalHits +
" documents found. Time :" + (endTime - startTime) + "ms");
for(ScoreDoc scoreDoc : hits.scoreDocs) {
Document doc = searcher.getDocument(scoreDoc);
System.out.print("Score: "+ scoreDoc.score + " ");
System.out.println("File: "+ doc.get(LuceneConstants.FILE_PATH));
}
searcher.close();
}
private void sortUsingIndex(String searchQuery)
throws IOException, ParseException {
searcher = new Searcher(indexDir);
long startTime = System.currentTimeMillis();
//create a term to search file name
Term term = new Term(LuceneConstants.FILE_NAME, searchQuery);
//create the term query object
Query query = new FuzzyQuery(term);
searcher.setDefaultFieldSortScoring(true, false);
//do the search
TopDocs hits = searcher.search(query,Sort.INDEXORDER);
long endTime = System.currentTimeMillis();
System.out.println(hits.totalHits +
" documents found. Time :" + (endTime - startTime) + "ms");
for(ScoreDoc scoreDoc : hits.scoreDocs) {
Document doc = searcher.getDocument(scoreDoc);
System.out.print("Score: "+ scoreDoc.score + " ");
System.out.println("File: "+ doc.get(LuceneConstants.FILE_PATH));
}
searcher.close();
}
}
Criação de diretório de dados e índice
Usamos 10 arquivos de texto de record1.txt a record10.txt contendo nomes e outros detalhes dos alunos e os colocamos no diretório E:\Lucene\Data. Dados de teste . Um caminho de diretório de índice deve ser criado como E: \ Lucene \ Index. Depois de executar o programa de indexação no capítuloLucene - Indexing Process, você pode ver a lista de arquivos de índice criados nessa pasta.
Executando o Programa
Depois de concluir a criação da fonte, dos dados brutos, do diretório de dados, do diretório de índice e dos índices, você pode compilar e executar seu programa. Para fazer isso, mantenha oLuceneTester.Java guia de arquivo ativa e use a opção Executar disponível no Eclipse IDE ou use Ctrl + F11 para compilar e executar seu LuceneTesterinscrição. Se o seu aplicativo for executado com êxito, ele imprimirá a seguinte mensagem no console do Eclipse IDE -
10 documents found. Time :31ms
Score: 1.3179655 File: E:\Lucene\Data\record3.txt
Score: 0.790779 File: E:\Lucene\Data\record1.txt
Score: 0.790779 File: E:\Lucene\Data\record2.txt
Score: 0.790779 File: E:\Lucene\Data\record4.txt
Score: 0.790779 File: E:\Lucene\Data\record5.txt
Score: 0.790779 File: E:\Lucene\Data\record6.txt
Score: 0.790779 File: E:\Lucene\Data\record7.txt
Score: 0.790779 File: E:\Lucene\Data\record8.txt
Score: 0.790779 File: E:\Lucene\Data\record9.txt
Score: 0.2635932 File: E:\Lucene\Data\record10.txt
10 documents found. Time :0ms
Score: 0.790779 File: E:\Lucene\Data\record1.txt
Score: 0.2635932 File: E:\Lucene\Data\record10.txt
Score: 0.790779 File: E:\Lucene\Data\record2.txt
Score: 1.3179655 File: E:\Lucene\Data\record3.txt
Score: 0.790779 File: E:\Lucene\Data\record4.txt
Score: 0.790779 File: E:\Lucene\Data\record5.txt
Score: 0.790779 File: E:\Lucene\Data\record6.txt
Score: 0.790779 File: E:\Lucene\Data\record7.txt
Score: 0.790779 File: E:\Lucene\Data\record8.txt
Score: 0.790779 File: E:\Lucene\Data\record9.txt