Lucene - Processo de Indexação
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, mostraremos 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 principal 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 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");
}
}
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 seu 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
Depois de executar o programa com sucesso, você terá o seguinte conteúdo em seu index directory −