Lucene

Úvod do lucenčiny

Úvod do lucenčiny
V tejto lekcii pochopíme fungovanie jedného z najsilnejších fulltextových vyhľadávacích nástrojov Apache Lucene. S Apache Lucene môžeme používať API, ktoré poskytuje, v mnohých programovacích jazykoch a vytvárať potrebné funkcie. Lucene je jedným z najsilnejších motorov, na ktorých je Elasticsearch postavený.Predtým, ako začneme s aplikáciou, ktorá demonštruje fungovanie Apache Lucene, pochopíme, ako Lucene funguje a veľa jeho komponentov. Začnime.

Prečo je potrebný Lucene?

Vyhľadávanie je jednou z najbežnejších operácií, ktoré vykonávame niekoľkokrát denne. Toto vyhľadávanie môže byť na viacerých webových stránkach, ktoré existujú na webe alebo v hudobnej aplikácii alebo v úložisku kódov alebo v kombinácii všetkých týchto. Jeden by si mohol myslieť, že jednoduchá relačná databáza môže tiež podporovať vyhľadávanie. Toto je správne. Databázy ako MySQL podporujú fulltextové vyhľadávanie. Čo však s webovou alebo hudobnou aplikáciou alebo archívom kódov alebo s kombináciou všetkých týchto možností? Databáza nemôže ukladať tieto údaje do svojich stĺpcov. Aj keby to tak bolo, spustenie tohto veľkého hľadania bude trvať neprijateľne dlho.

Fulltextový vyhľadávací modul je schopný spustiť vyhľadávací dopyt na miliónoch súborov naraz. Rýchlosť, akou sú dnes dáta v aplikácii ukladané, sú obrovské. Spustenie fulltextového vyhľadávania na takomto objeme dát je ťažká úloha. Je to tak preto, lebo informácie, ktoré potrebujeme, môžu existovať v jednom súbore z miliárd súborov uchovávaných na webe.

Ako funguje Lucene?

Zrejmá otázka, ktorá by vás mala napadnúť, je, ako je Lucene taký rýchly pri spúšťaní fulltextových vyhľadávacích dotazov? Odpoveď na to, samozrejme, je pomocou indexov, ktoré vytvára. Namiesto vytvorenia klasického indexu však Lucene využíva Invertované indexy.

V klasickom indexe zhromažďujeme pre každý dokument úplný zoznam slov alebo výrazov, ktoré dokument obsahuje. V obrátenom indexe pre každé slovo vo všetkých dokumentoch ukladáme, aký dokument a umiestnenie tohto slova / výrazu nájdete na. Jedná sa o vysoko štandardný algoritmus, vďaka ktorému je vyhľadávanie veľmi jednoduché. Zvážte nasledujúci príklad vytvorenia klasického indexu:

Doc1 -> "This", "is", "simple", "Lucene", "sample", "classic", "inverted", "index"
Doc2 -> "Spustené", "Elasticsearch", "Ubuntu", "Aktualizovať"
Doc3 -> "RabbitMQ", "Lucene", "Kafka", "", "Spring", "Boot"

Ak použijeme inverzný index, budeme mať indexy ako:

This -> (2, 71)
Lucene -> (1, 9), (12,87)
Apache -> (12, 91)
Rámec -> (32, 11)

Invertované indexy sa udržiavajú oveľa ľahšie. Predpokladajme, že ak chceme nájsť Apache v mojich podmienkach, budem mať okamžité odpovede s Invertovanými indexmi, zatiaľ čo pri klasickom vyhľadávaní bude prebiehať kompletný dokument, ktorý by nebolo možné spustiť v scenároch v reálnom čase.

Lucene workflow

Predtým, ako bude môcť Lucene skutočne vyhľadávať údaje, je potrebné vykonať určité kroky. Pre lepšie pochopenie si predstavíme tieto kroky:

Lucene Workflow

Ako je znázornené na diagrame, v Lucene sa deje toto:

  1. Lucene podáva dokumenty a ďalšie zdroje údajov
  2. Pre každý dokument Lucene najskôr prevedie tieto údaje na obyčajný text a potom analyzátory skonvertujú tento zdroj na obyčajný text
  3. Pre každý výraz v obyčajnom texte sa vytvárajú obrátené indexy
  4. Indexy sú pripravené na vyhľadávanie

Vďaka tomuto pracovnému postupu je Lucene veľmi silný fulltextový vyhľadávací nástroj. Toto je ale jediná časť, ktorú Lucene spĺňa. Musíme si prácu vykonať sami. Pozrime sa na potrebné komponenty indexovania.

Lucene Components

V tejto časti si popíšeme základné komponenty a základné triedy Lucene používané na vytváranie indexov:

Príklad aplikácie

Na vytvorenie vzorového projektu pre náš príklad použijeme jeden z mnohých archívov Maven. Ak chcete vytvoriť projekt, vykonajte nasledujúci príkaz v adresári, ktorý použijete ako pracovný priestor:

archív typu mvn: generate -DgroupId = com.linuxhint.príklad -DartifactId = LH-LuceneExample -DarchetypeArtifactId = maven-archetype-quickstart -DinteractiveMode = false

Ak používate maven prvýkrát, vykonanie príkazu generate bude trvať niekoľko sekúnd, pretože maven musí stiahnuť všetky požadované pluginy a artefakty, aby mohol vykonať generačnú úlohu. Takto vyzerá výstup projektu:

Nastavenie projektu

Po vytvorení projektu ho môžete otvoriť vo svojom obľúbenom IDE. Ďalším krokom je pridanie vhodných závislostí Maven do projektu. Tu je pom.xml súbor s príslušnými závislosťami:



org.apache.lucene
lucene-jadro
4.6.0


org.apache.lucene
lucene-analyzátory-bežné
4.6.0

Nakoniec, aby sme pochopili všetky JAR, ktoré sa pridajú do projektu, keď sme pridali túto závislosť, môžeme spustiť jednoduchý príkaz Maven, ktorý nám umožní vidieť kompletný strom závislostí projektu, keď k nemu pridáme nejaké závislosti. Tu je príkaz, ktorý môžeme použiť:

závislosť mvn: strom

Keď spustíme tento príkaz, zobrazí sa nám tento strom závislostí:

Nakoniec vytvoríme triedu SimpleIndexer, ktorá sa spustí

balíček kom.linuxhint.príklad;
import java.io.Spis;
import java.io.FileReader;
import java.io.IOException;
import org.apache.lucene.analýza.Analyzátor;
import org.apache.lucene.analýza.štandard.StandardAnalyzer;
import org.apache.lucene.dokument.Dokument;
import org.apache.lucene.dokument.StoredField;
import org.apache.lucene.dokument.Textové pole;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.obchod.FSDirectory;
import org.apache.lucene.util.Verzia;
verejná trieda SimpleIndexer
private static final String indexDirectory = "/ Users / shubham / niekam / LH-LuceneExample / Index";
private static final String dirToBeIndexed = "/ Users / shubham / niekam / LH-LuceneExample / src / main / java / com / linuxhint / príklad";
public static void main (String [] args) vyvolá výnimku
File indexDir = nový súbor (indexDirectory);
Súbor dataDir = nový súbor (dirToBeIndexed);
SimpleIndexer indexer = nový SimpleIndexer ();
int numIndexed = indexátor.index (indexDir, dataDir);
Systém.von.println ("Celkovo indexovanych suborov" + numIndexed);

private int index (File indexDir, File dataDir) vrhá IOException
Analyzátor analyzátor = nový StandardAnalyzer (verzia.LUCENE_46);
Konfigurácia IndexWriterConfig = nová IndexWriterConfig (verzia.LUCENE_46,
analyzátor);
IndexWriter indexWriter = nový IndexWriter (FSDirectory.otvorené (indexDir),
konfigurácia);
File [] files = dataDir.listFiles ();
pre (Súbor f: súbory)
Systém.von.println ("Indexačný súbor" + f.getCanonicalPath ());
Dokument doc = nový dokument ();
doc.add (nový TextField ("obsah", nový FileReader (f)));
doc.add (nový StoredField ("názov súboru"), f.getCanonicalPath ()));
indexWriter.addDocument (doc);

int numIndexed = indexWriter.maxDoc ();
indexWriter.Zavrieť();
návrat numIndexed;

V tomto kóde sme práve vytvorili inštanciu dokumentu a pridali nové pole, ktoré predstavuje obsah súboru. Tu je výstup, ktorý dostaneme, keď spustíme tento súbor:

Indexovací súbor / Používatelia / shubham / niekde / LH-LuceneExample / src / main / java / com / linuxhint / príklad / SimpleIndexer.java
Celkový počet indexovaných súborov 1

V rámci projektu sa tiež vytvorí nový adresár s nasledujúcim obsahom:

Údaje indexu

Budeme analyzovať, čo sú všetky súbory vytvorené v tomto indexe, v ďalších lekciách pre Lucene.

Záver

V tejto lekcii sme sa pozreli na to, ako Apache Lucene funguje, a vytvorili sme tiež jednoduchý príklad aplikácie, ktorá bola založená na Maven a java.

Pridajte gestá myši do systému Windows 10 pomocou týchto bezplatných nástrojov
V posledných rokoch sa počítače a operačné systémy veľmi vyvinuli. Boli časy, keď používatelia museli prechádzať správcami súborov pomocou príkazov. R...
Ovládajte a spravujte pohyb myši medzi viacerými monitormi v systéme Windows 10
Správca myši s duálnym displejom umožňuje ovládať a konfigurovať pohyb myši medzi viacerými monitormi spomalením jeho pohybu blízko hranice. Windows 1...
WinMouse vám umožňuje prispôsobiť a vylepšiť pohyb ukazovateľa myši na počítači so systémom Windows
Ak chcete vylepšiť predvolené funkcie kurzora myši, použite freeware WinMouse. Pridáva ďalšie funkcie, ktoré vám pomôžu vyťažiť zo svojej skromnej myš...