Lucène

Introduction à Lucène

Introduction à Lucène
Dans cette leçon, nous allons comprendre le fonctionnement de l'un des moteurs de recherche en texte intégral les plus puissants, Apache Lucene. Avec Apache Lucene, nous pouvons utiliser les API qu'il expose dans de nombreux langages de programmation et créer les fonctionnalités dont nous avons besoin. Lucene est l'un des moteurs les plus puissants sur lesquels Elasticsearch est construit.Avant de commencer avec une application qui montre le fonctionnement d'Apache Lucene, nous allons comprendre comment fonctionne Lucene et bon nombre de ses composants. Commençons.

Pourquoi Lucene est-il nécessaire?

La recherche est l'une des opérations les plus courantes que nous effectuons plusieurs fois par jour. Cette recherche peut porter sur plusieurs pages Web qui existent sur le Web ou une application musicale ou un référentiel de code ou une combinaison de tous ces éléments. On pourrait penser qu'une simple base de données relationnelle peut aussi prendre en charge la recherche. C'est correct. Les bases de données comme MySQL prennent en charge la recherche en texte intégral. Mais qu'en est-il du Web ou d'une application musicale ou d'un référentiel de code ou d'une combinaison de tout cela? La base de données ne peut pas stocker ces données dans ses colonnes. Même si c'était le cas, il faudra un temps inacceptable pour lancer une recherche aussi importante.

Un moteur de recherche en texte intégral est capable d'exécuter une requête de recherche sur des millions de fichiers à la fois. La vitesse à laquelle les données sont stockées dans une application aujourd'hui est énorme. Exécuter la recherche en texte intégral sur ce type de volume de données est une tâche difficile. En effet, les informations dont nous avons besoin peuvent exister dans un seul fichier parmi des milliards de fichiers conservés sur le Web.

Comment fonctionne Lucène?

La question évidente qui devrait vous venir à l'esprit est de savoir comment Lucene est-il si rapide à exécuter des requêtes de recherche en texte intégral? La réponse à cela, bien sûr, est à l'aide d'indices qu'il crée. Mais au lieu de créer un index classique, Lucene utilise Indices inversés.

Dans un index classique, pour chaque document, nous collectons la liste complète des mots ou termes contenus dans le document. Dans un index inversé, pour chaque mot dans tous les documents, nous stockons quel document et positionnons ce mot/terme à. Il s'agit d'un algorithme de haut niveau qui rend la recherche très facile. Prenons l'exemple suivant de création d'un index classique :

Doc1 -> "Ceci", "est", "simple", "Lucene", "échantillon", "classique", "inversé", "index"
Doc2 -> "En cours d'exécution", "Elasticsearch", "Ubuntu", "Mise à jour"
Doc3 -> "RabbitMQ", "Lucene", "Kafka", "", "Printemps", "Boot"

Si nous utilisons l'index inversé, nous aurons des index comme :

Ceci -> (2, 71)
Lucène -> (1, 9), (12,87)
Apache -> (12, 91)
Cadre -> (32, 11)

Les indices inversés sont beaucoup plus faciles à maintenir. Supposons que si nous voulons trouver Apache dans mes termes, j'aurai des réponses immédiates avec des indices inversés alors qu'avec la recherche classique, je fonctionnerai sur des documents complets qui n'auraient peut-être pas été possibles dans des scénarios en temps réel.

Flux de travail Lucene

Avant que Lucene puisse réellement rechercher les données, il doit effectuer des étapes. Visualisons ces étapes pour une meilleure compréhension :

Flux de travail Lucene

Comme le montre le schéma, voici ce qui se passe dans Lucene :

  1. Lucene se nourrit des documents et autres sources de données
  2. Pour chaque document, Lucene convertit d'abord ces données en texte brut, puis les analyseurs convertissent cette source en texte brut
  3. Pour chaque terme du texte brut, les indices inversés sont créés
  4. Les index sont prêts à être recherchés

Avec ce workflow, Lucene est un moteur de recherche plein texte très puissant. Mais c'est la seule partie que Lucene remplit. Nous devons effectuer le travail nous-mêmes. Regardons les composants de l'indexation nécessaires.

Composants de Lucène

Dans cette section, nous décrirons les composants de base et les classes Lucene de base utilisées pour créer des index :

Exemple d'application

Nous utiliserons l'un des nombreux archétypes Maven pour créer un exemple de projet pour notre exemple. Pour créer le projet, exécutez la commande suivante dans un répertoire que vous utiliserez comme espace de travail :

archétype mvn:generate -DgroupId=com.astuce linux.exemple -DartifactId=LH-LuceneExample -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

Si vous exécutez maven pour la première fois, il faudra quelques secondes pour accomplir la commande de génération car maven doit télécharger tous les plugins et artefacts requis afin de faire la tâche de génération. Voici à quoi ressemble la sortie du projet :

Configuration du projet

Une fois que vous avez créé le projet, n'hésitez pas à l'ouvrir dans votre IDE préféré. L'étape suivante consiste à ajouter les dépendances Maven appropriées au projet. Voici le pompon.xml avec les dépendances appropriées :



organisation.apache.lucène
lucene-core
4.6.0


organisation.apache.lucène
analyseurs-lucene-commun
4.6.0

Enfin, pour comprendre tous les JAR qui sont ajoutés au projet lorsque nous avons ajouté cette dépendance, nous pouvons exécuter une simple commande Maven qui nous permet de voir un arbre de dépendances complet pour un projet lorsque nous y ajoutons des dépendances. Voici une commande que nous pouvons utiliser :

dépendance mvn:arborescence

Lorsque nous exécutons cette commande, elle nous montrera l'arbre de dépendances suivant :

Enfin, nous créons une classe SimpleIndexer qui exécute

paquet com.astuce linux.Exemple;
importer java.io.Déposer;
importer java.io.Lecteur de fichiers ;
importer java.io.IOException ;
importer l'organisation.apache.lucène.Analyse.Analyseur ;
importer l'organisation.apache.lucène.Analyse.la norme.Analyseur standard ;
importer l'organisation.apache.lucène.document.Document;
importer l'organisation.apache.lucène.document.Champ Stocké ;
importer l'organisation.apache.lucène.document.Champ de texte;
importer l'organisation.apache.lucène.indice.IndexWriter;
importer l'organisation.apache.lucène.indice.IndexWriterConfig;
importer l'organisation.apache.lucène.boutique.FSDirectory ;
importer l'organisation.apache.lucène.util.Version;
classe publique SimpleIndexer
private static final String indexDirectory = "/Users/shubham/somewhere/LH-LuceneExample/Index" ;
Private static final String dirToBeIndexed = "/Users/shubham/somewhere/LH-LuceneExample/src/main/java/com/linuxhint/example" ;
public static void main(String[] args) lève une exception
Fichier indexDir = new File(indexDirectory);
Fichier dataDir = new File(dirToBeIndexed);
Indexeur SimpleIndexer = new SimpleIndexer();
int numIndexed = indexeur.index(indexDir, dataDir);
Système.en dehors.println("Total des fichiers indexés " + numIndexed);

private int index (File indexDir, File dataDir) lève IOException
Analyseur analyseur = nouveau StandardAnalyzer(Version.LUCÈNE_46);
IndexWriterConfig config = new IndexWriterConfig(Version.LUCÈNE_46,
analyseur);
IndexWriter indexWriter = new IndexWriter(FSDirectory.open(indexDir),
configuration);
File[] files = dataDir.listeFichiers();
pour (Fichier f : fichiers)
Système.en dehors.println("Fichier d'indexation " + f.getCanonicalPath());
Document doc = nouveau Document();
doc.add(new TextField("content", new FileReader(f)));
doc.add(new StoredField("fileName", f.getCanonicalPath()));
indexWriter.addDocument(doc);

int numIndexed = indexWriter.maxDoc();
indexWriter.Fermer();
return numIndexed;

Dans ce code, nous venons de créer une instance de document et d'ajouter un nouveau champ qui représente le contenu du fichier. Voici la sortie que nous obtenons lorsque nous exécutons ce fichier :

Fichier d'indexation /Users/shubham/somewhere/LH-LuceneExample/src/main/java/com/linuxhint/example/SimpleIndexer.Java
Nombre total de fichiers indexés 1

De plus, un nouveau répertoire est créé dans le projet avec le contenu suivant :

Indexer les données

Nous analyserons ce que tous les fichiers sont créés dans ces index dans d'autres leçons à venir sur Lucene.

Conclusion

Dans cette leçon, nous avons examiné le fonctionnement d'Apache Lucene et nous avons également créé un exemple d'application simple basé sur Maven et Java.

Le bouton de clic gauche de la souris ne fonctionne pas sous Windows 10
Si vous utilisez une souris dédiée avec votre ordinateur portable ou de bureau mais que le le clic gauche de la souris ne fonctionne pas sur Windows 1...
Le curseur saute ou se déplace de manière aléatoire lors de la saisie dans Windows 10
Si vous constatez que le curseur de votre souris saute ou se déplace tout seul, automatiquement, au hasard lors de la saisie sur un ordinateur portabl...
Comment inverser le sens de défilement de la souris et des pavés tactiles dans Windows 10
Souris et Pavé tactiles rendent non seulement l'informatique facile, mais plus efficace et moins chronophage. Nous ne pouvons pas imaginer une vie san...