Lucene - Opzioni sul campo

Il campo è l'unità più importante del processo di indicizzazione. È l'oggetto effettivo che contiene i contenuti da indicizzare. Quando aggiungiamo un campo, Lucene fornisce numerosi controlli sul campo utilizzando le Opzioni campo che indicano quanto un campo deve essere ricercabile.

Aggiungiamo documenti contenenti campi a IndexWriter dove IndexWriter viene utilizzato per aggiornare o creare indici.

Ora ti mostreremo un approccio graduale e ti aiuteremo a comprendere le varie opzioni di campo utilizzando un esempio di base.

Varie opzioni di campo

Di seguito sono riportate le varie opzioni di campo:

  • Index.ANALYZED- In questo, prima analizziamo, quindi facciamo l'indicizzazione. Viene utilizzato per la normale indicizzazione del testo. L'analizzatore suddividerà il valore del campo in un flusso di token e ogni token sarà ricercabile separatamente.

  • Index.NOT_ANALYZED- In questo non analizziamo ma facciamo l'indicizzazione. Viene utilizzato per l'indicizzazione completa del testo. Ad esempio, i nomi delle persone, l'URL ecc.

  • Index.ANALYZED_NO_NORMS - Questa è una variante di Index.ANALYZED. L'analizzatore suddividerà il valore del campo in un flusso di token e ogni token sarà ricercabile separatamente. Tuttavia, le NORM non vengono memorizzate negli indici. Le NORME vengono utilizzate per potenziare la ricerca e questo spesso finisce per consumare molta memoria.

  • Index.Index.NOT_ANALYZED_NO_NORMS - Questa è una variante di Index.NOT_ANALYZED. L'indicizzazione viene eseguita ma le NORME non vengono memorizzate negli indici.

  • Index.NO - Il valore del campo non è ricercabile.

Uso delle opzioni di campo

Di seguito sono riportati i diversi modi in cui è possibile utilizzare le Opzioni campo:

  • Per creare un metodo per ottenere un documento Lucene da un file di testo.

  • Per creare vari tipi di campi che sono coppie di valori chiave contenenti chiavi come nomi e valori come contenuti da indicizzare.

  • Per impostare il campo da analizzare o meno. Nel nostro caso va analizzato solo il contenuto in quanto può contenere dati come a, am, are, an, ecc. Che non sono richiesti nelle operazioni di ricerca.

  • Per aggiungere i campi appena creati all'oggetto documento e restituirlo 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;
}

Applicazione di esempio

Per testare il processo di indicizzazione, è necessario creare un 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 . È inoltre possibile utilizzare il progetto creato nel capitolo EJB - Prima applicazione in quanto tale per questo capitolo per comprendere il processo di indicizzazione.

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 di business 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, dei dati grezzi, della directory dei dati e della directory dell'indice, puoi compilare ed eseguire il tuo programma. Per fare ciò, tieni il fileLuceneTester.Java scheda file attiva e utilizzare l'opzione Esegui disponibile nell'IDE Eclipse o utilizzare Ctrl + 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 -