Lucene

Introduzione a Lucene

Introduzione a Lucene
In questa lezione capiremo il funzionamento di uno dei più potenti motori di ricerca full-text, Apache Lucene. Con Apache Lucene, possiamo utilizzare le API che espone in molti linguaggi di programmazione e creare le funzionalità di cui abbiamo bisogno. Lucene è uno dei motori più potenti su cui è costruito Elasticsearch.Prima di iniziare con un'applicazione che dimostra il funzionamento di Apache Lucene, capiremo come funziona Lucene e molti dei suoi componenti. Iniziamo.

Perché è necessario Lucene Luce?

La ricerca è una delle operazioni più comuni che eseguiamo più volte al giorno. Questa ricerca può riguardare più pagine Web che esistono sul Web o un'applicazione musicale o un repository di codice o una combinazione di tutti questi. Si potrebbe pensare che un semplice database relazionale possa supportare anche la ricerca. Questo è corretto. I database come MySQL supportano la ricerca full-text. Ma che dire del Web o di un'applicazione musicale o di un repository di codice o di una combinazione di tutti questi?? Il database non può memorizzare questi dati nelle sue colonne. Anche se così fosse, ci vorrà una quantità di tempo inaccettabile per eseguire la ricerca così grande.

Un motore di ricerca full-text è in grado di eseguire una query di ricerca su milioni di file contemporaneamente. La velocità con cui i dati vengono archiviati in un'applicazione oggi è enorme. L'esecuzione della ricerca full-text su questo tipo di volume di dati è un compito difficile. Questo perché le informazioni di cui abbiamo bisogno potrebbero esistere in un singolo file tra miliardi di file conservati sul web.

Come funziona Lucene?

La domanda ovvia che dovrebbe venirti in mente è: come fa Lucene a eseguire query di ricerca full-text così velocemente?? La risposta a questo, ovviamente, è con l'aiuto degli indici che crea. Ma invece di creare un indice classico, Lucene utilizza Indici invertiti.

In un indice classico, per ogni documento, raccogliamo l'elenco completo di parole o termini che il documento contiene. In un indice invertito, per ogni parola in tutti i documenti, memorizziamo quale documento e posizioniamo questa parola/termine in cui si trova. Questo è un algoritmo di alto livello che rende la ricerca molto semplice. Considera il seguente esempio di creazione di un indice classico:

Doc1 -> "Questo", "è", "semplice", "Lucene", "campione", "classico", "invertito", "indice"
Doc2 -> "In esecuzione", "Elasticsearch", "Ubuntu", "Aggiorna"
Doc3 -> "RabbitMQ", "Lucene", "Kafka", "", "Spring", "Boot"

Se usiamo l'indice invertito, avremo indici come:

Questo -> (2, 71)
Lucene -> (1, 9), (12,87)
Apache -> (12, 91)
Struttura -> (32, 11)

Gli indici invertiti sono molto più facili da mantenere. Supponiamo che se vogliamo trovare Apache nei miei termini, avrò risposte immediate con indici invertiti mentre con la ricerca classica verrà eseguito su documenti completi che potrebbe non essere stato possibile eseguire in scenari in tempo reale.

Flusso di lavoro Lucene

Prima che Lucene possa effettivamente cercare i dati, deve eseguire dei passaggi. Visualizziamo questi passaggi per una migliore comprensione:

Flusso di lavoro Lucene

Come mostrato nel diagramma, questo è ciò che accade in Lucene:

  1. Lucene riceve i documenti e altre fonti di dati
  2. Per ogni documento, Lucene prima converte questi dati in testo normale e poi gli analizzatori converte questa fonte in testo normale
  3. Per ogni termine nel testo in chiaro vengono creati gli indici invertiti
  4. Gli indici sono pronti per essere ricercati

Con questo flusso di lavoro, Lucene è un motore di ricerca full-text molto potente. Ma questa è l'unica parte che Lucene soddisfa. Dobbiamo eseguire il lavoro da soli. Diamo un'occhiata ai componenti necessari per l'indicizzazione.

Componenti Lucene

In questa sezione descriveremo i componenti di base e le classi Lucene di base utilizzate per creare gli indici:

Esempio di applicazione

Useremo uno dei tanti archetipi Maven per creare un progetto di esempio per il nostro esempio. Per creare il progetto esegui il seguente comando in una directory che utilizzerai come spazio di lavoro:

archetipo mvn:generate -DgroupId=com.linuxhint.esempio -DartifactId=LH-LuceneExample -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

Se stai eseguendo maven per la prima volta, ci vorranno alcuni secondi per eseguire il comando generate perché Maven deve scaricare tutti i plugin e gli artefatti necessari per eseguire l'attività di generazione. Ecco come appare l'output del progetto:

Configurazione del progetto

Una volta creato il progetto, sentiti libero di aprirlo nel tuo IDE preferito. Il prossimo passo è aggiungere le dipendenze Maven appropriate al progetto. Ecco il pom.xml con le dipendenze appropriate:



organizzazione.apache.lucene
lucene-core
4.6.0


organizzazione.apache.lucene
lucene-analyzers-comune
4.6.0

Infine, per comprendere tutti i JAR che vengono aggiunti al progetto quando aggiungiamo questa dipendenza, possiamo eseguire un semplice comando Maven che ci consente di vedere un albero delle dipendenze completo per un progetto quando aggiungiamo alcune dipendenze ad esso. Ecco un comando che possiamo usare:

dipendenza mvn: albero

Quando eseguiamo questo comando, ci mostrerà il seguente albero delle dipendenze:

Infine, creiamo una classe SimpleIndexer che viene eseguita

pacchetto com.linuxhint.esempio;
import java.io.File;
import java.io.Lettore di file;
import java.io.IOException;
importare organizzazione.apache.lucene.analisi.Analizzatore;
importare organizzazione.apache.lucene.analisi.standard.Analizzatore standard;
importare organizzazione.apache.lucene.documento.Documento;
importare organizzazione.apache.lucene.documento.Campo Memorizzato;
importare organizzazione.apache.lucene.documento.Campo di testo;
importare organizzazione.apache.lucene.indice.IndexWriter;
importare organizzazione.apache.lucene.indice.IndexWriterConfig;
importare organizzazione.apache.lucene.negozio.FSDirectory;
importare organizzazione.apache.lucene.utile.Versione;
public class 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) genera l'eccezione
File indexDir = new File(indexDirectory);
File dataDir = new File(dirToBeIndexed);
Indicizzatore SimpleIndexer = new SimpleIndexer();
int numIndexed = indexer.index(indexDir, dataDir);
Sistema.su.println("Totale file indicizzati " + numIndexed);

private int index(File indexDir, File dataDir) genera IOException
Analizzatore analizzatore = nuovo StandardAnalyzer(Versione.LUCENE_46);
IndexWriterConfig config = new IndexWriterConfig(Versione.LUCENE_46,
analizzatore);
IndexWriter indexWriter = nuovo IndexWriter(FSDirectory.open(indexDir),
configurazione);
File[] files = dataDir.listFiles();
for (File f : file)
Sistema.su.println("Indicizzazione file " + f.getCanonicalPath());
Documento doc = nuovo Documento();
documento.add(new TextField("content", new FileReader(f)));
documento.add(new StoredField("fileName", f.getCanonicalPath()));
indiceWriter.addDocument(doc);

int numIndexed = indexWriter.maxDoc();
indiceWriter.vicino();
restituisce numIndexed;

In questo codice, abbiamo appena creato un'istanza Document e aggiunto un nuovo campo che rappresenta il contenuto del file. Ecco l'output che otteniamo quando eseguiamo questo file:

File di indicizzazione /Users/shubham/somewhere/LH-LuceneExample/src/main/java/com/linuxhint/example/SimpleIndexer.Giava
File totali indicizzati 1

Inoltre, viene creata una nuova directory all'interno del progetto con il seguente contenuto:

Dati indice

Analizzeremo ciò che tutti i file vengono creati in questi Index in altre lezioni a venire su Lucene.

Conclusione

In questa lezione, abbiamo visto come funziona Apache Lucene e abbiamo anche realizzato una semplice applicazione di esempio basata su Maven e Java.

I migliori giochi di laboratorio dell'app Oculus
Se possiedi un visore Oculus, devi essere informato sul sideloading. Il sideloading è il processo di installazione di contenuti non archiviati sul vis...
I 10 migliori giochi da giocare su Ubuntu
La piattaforma Windows è stata una delle piattaforme dominanti per i giochi a causa dell'enorme percentuale di giochi che si stanno sviluppando oggi p...
I 5 migliori giochi arcade per Linux
Al giorno d'oggi, i computer sono macchine serie utilizzate per i giochi. Se non riesci a ottenere il nuovo punteggio più alto, saprai cosa intendo. I...