Lucene - Aggiungi operazione documento
Aggiungi documento è una delle operazioni principali del processo di indicizzazione.
Abbiamo Aggiungi documento (s) contenente Field (s) a IndexWriter dove IndexWriter viene utilizzato per aggiornare o creare indici.
Ora ti mostreremo un approccio graduale e ti aiuteremo a capire come aggiungere un documento utilizzando un esempio di base.
Aggiungi un documento a un indice
Segui questi passaggi per aggiungere un documento a un indice:
Step 1 - Creare un metodo per ottenere un documento Lucene da un file di testo.
Step 2 - Creare vari campi che sono coppie di valori chiave contenenti chiavi come nomi e valori come contenuti da indicizzare.
Step 3- Imposta il campo da analizzare o meno. Nel nostro caso è da analizzare solo il contenuto in quanto può contenere dati come a, am, are, an ecc. Che non sono richiesti nelle operazioni di ricerca.
Step 4 - Aggiungi i campi appena creati all'oggetto documento e restituiscilo al metodo del chiamante.
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;
}
Crea un IndexWriter
La classe IndexWriter funge da componente principale che crea / aggiorna gli indici durante il processo di indicizzazione.
Segui questi passaggi per creare un IndexWriter:
Step 1 - Crea oggetto di IndexWriter.
Step 2 - Creare una directory Lucene che dovrebbe puntare alla posizione in cui devono essere archiviati gli indici.
Inizializza l'oggetto IndexWriter creato con la directory index, un analizzatore standard con informazioni sulla versione e altri parametri obbligatori / facoltativi.
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);
}
Aggiungi documento e avvia il processo di indicizzazione
I seguenti due sono i modi per aggiungere il documento.
addDocument(Document) - Aggiunge il documento utilizzando l'analizzatore predefinito (specificato quando viene creato l'index writer).
addDocument(Document,Analyzer) - Aggiunge il documento utilizzando l'analizzatore fornito.
private void indexFile(File file) throws IOException {
System.out.println("Indexing "+file.getCanonicalPath());
Document document = getDocument(file);
writer.addDocument(document);
}
Applicazione di esempio
Per testare il processo di indicizzazione, dobbiamo creare il test dell'applicazione Lucene.
Passo | Descrizione |
---|---|
1 | Creare un progetto con un nome LuceneFirstApplication sotto un pacchetto com.tutorialspoint.lucene come spiegato nel capitolo Lucene - Prima applicazione . Per comprendere il processo di indicizzazione, è anche possibile utilizzare il progetto creato nel capitolo EJB - Prima applicazione come tale per questo capitolo. |
2 | Creare LuceneConstants.java, TextFileFilter.java e Indexer.java come spiegato nel capitolo Lucene - Prima applicazione . Mantieni invariato il resto dei file. |
3 | Crea LuceneTester.java come indicato di seguito. |
4 | Pulisci e crea l'applicazione per assicurarti che la logica aziendale funzioni secondo i requisiti. |
LuceneConstants.java
Questa classe viene utilizzata per fornire varie costanti da utilizzare nell'applicazione di esempio.
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
Questa classe viene utilizzata come filtro di file .txt.
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
Questa classe viene utilizzata per indicizzare i dati grezzi in modo che possiamo renderli ricercabili utilizzando la libreria 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
Questa classe viene utilizzata per testare la capacità di indicizzazione della libreria 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");
}
}
Creazione di directory di dati e indici
Abbiamo utilizzato 10 file di testo da record1.txt a record10.txt contenenti nomi e altri dettagli degli studenti e li abbiamo inseriti nella directory E:\Lucene\Data. Dati di prova . Un percorso della directory dell'indice dovrebbe essere creato comeE:\Lucene\Index. Dopo aver eseguito questo programma, puoi vedere l'elenco dei file di indice creati in quella cartella.
Esecuzione del programma
Una volta che hai finito con la creazione del sorgente, creando i dati grezzi, la directory dei dati e la directory dell'indice, sei pronto per questo passaggio che è la compilazione e l'esecuzione del programma. Per fare ciò, mantenere attiva la scheda del file LuceneTester.Java e utilizzare l'opzione Esegui disponibile nell'IDE Eclipse o utilizzareCtrl + F11 per compilare ed eseguire il tuo LuceneTesterapplicazione. Se l'applicazione viene eseguita correttamente, stamperà il seguente messaggio nella console dell'IDE di Eclipse:
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
Dopo aver eseguito correttamente il programma, avrai i seguenti contenuti nel tuo file index directory -