Lucene - Options de champ

Le champ est l'unité la plus importante du processus d'indexation. C'est l'objet réel contenant le contenu à indexer. Lorsque nous ajoutons un champ, Lucene fournit de nombreux contrôles sur le champ en utilisant les options de champ qui indiquent dans quelle mesure un champ doit être recherché.

Nous ajoutons des documents contenant des champs à IndexWriter où IndexWriter est utilisé pour mettre à jour ou créer des index.

Nous allons maintenant vous montrer une approche par étapes et vous aider à comprendre les différentes options de champ à l'aide d'un exemple de base.

Diverses options de champ

Voici les différentes options de champ -

  • Index.ANALYZED- En cela, nous analysons d'abord, puis faisons l'indexation. Ceci est utilisé pour l'indexation de texte normal. L'analyseur divisera la valeur du champ en flux de jetons et chaque jeton peut être recherché séparément.

  • Index.NOT_ANALYZED- En cela, nous n'analysons pas mais faisons de l'indexation. Ceci est utilisé pour l'indexation complète du texte. Par exemple, les noms de personne, l'URL, etc.

  • Index.ANALYZED_NO_NORMS - Ceci est une variante de Index.ANALYZED. L'analyseur divisera la valeur du champ en flux de jetons et chaque jeton peut être recherché séparément. Cependant, les NORM ne sont pas stockés dans les index. Les NORMES sont utilisées pour booster la recherche et cela finit souvent par consommer beaucoup de mémoire.

  • Index.Index.NOT_ANALYZED_NO_NORMS - Ceci est une variante de Index.NOT_ANALYZED. L'indexation est effectuée mais les NORMES ne sont pas stockées dans les index.

  • Index.NO - La valeur du champ ne peut pas être recherchée.

Utilisation des options de champ

Voici les différentes façons dont les options de champ peuvent être utilisées -

  • Pour créer une méthode pour obtenir un document Lucene à partir d'un fichier texte.

  • Pour créer divers types de champs qui sont des paires clé-valeur contenant des clés comme noms et des valeurs comme contenus à indexer.

  • Pour définir le champ à analyser ou non. Dans notre cas, seul le contenu est à analyser car il peut contenir des données telles que a, am, are, an, etc. qui ne sont pas nécessaires dans les opérations de recherche.

  • Pour ajouter les champs nouvellement créés à l'objet document et le renvoyer à la méthode appelante.

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;
}

Exemple d'application

Pour tester le processus d'indexation, nous devons créer un test d'application Lucene.

Étape La description
1

Créez un projet avec un nom LuceneFirstApplication sous un package com.tutorialspoint.lucene comme expliqué dans le chapitre Lucene - Première application . Vous pouvez également utiliser le projet créé dans le chapitre EJB - Première application en tant que tel pour ce chapitre pour comprendre le processus d'indexation.

2

Créez LuceneConstants.java, TextFileFilter.java et Indexer.java comme expliqué dans le chapitre Lucene - Première application . Gardez le reste des fichiers inchangés.

3

Créez LuceneTester.java comme indiqué ci-dessous.

4

Nettoyez et créez l'application pour vous assurer que la logique métier fonctionne conformément aux exigences.

LuceneConstants.java

Cette classe est utilisée pour fournir diverses constantes à utiliser dans l'exemple d'application.

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

Cette classe est utilisée comme filtre de fichier .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

Cette classe est utilisée pour indexer les données brutes afin que nous puissions les rendre consultables à l'aide de la bibliothèque 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

Cette classe est utilisée pour tester la capacité d'indexation de la bibliothèque 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");		
   }
}

Création de répertoires de données et d'index

Nous avons utilisé 10 fichiers texte de record1.txt à record10.txt contenant les noms et autres détails des étudiants et les avons mis dans le répertoire E: \ Lucene \ Data. Données de test . Un chemin de répertoire d'index doit être créé commeE:\Lucene\Index. Après avoir exécuté ce programme, vous pouvez voir la liste des fichiers d'index créés dans ce dossier.

Exécution du programme

Une fois que vous avez terminé la création de la source, des données brutes, du répertoire de données et du répertoire d'index, vous pouvez compiler et exécuter votre programme. Pour ce faire, gardez leLuceneTester.Java onglet fichier actif et utilisez soit l'option Exécuter disponible dans l'EDI Eclipse, soit utilisez Ctrl + F11 pour compiler et exécuter votre LuceneTesterapplication. Si votre application s'exécute avec succès, elle imprimera le message suivant dans la console d'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

Une fois que vous avez exécuté le programme avec succès, vous aurez le contenu suivant dans votre index directory -