Liucenė

„Lucene“ įvadas

„Lucene“ įvadas
Šioje pamokoje suprasime vienos iš galingiausių viso teksto paieškos sistemų „Apache Lucene“ veikimą. Naudodami „Apache Lucene“, mes galime naudoti daugelio programavimo kalbų pateiktus API ir sukurti reikalingas funkcijas. „Lucene“ yra vienas galingiausių variklių, ant kurio sukurtas „Elasticsearch“.Prieš pradėdami nuo programos, parodančios „Apache Lucene“ veikimą, suprasime, kaip veikia „Lucene“ ir daugelis jo komponentų. Pradėkime.

Kodėl reikalinga Lucene?

Paieška yra viena iš labiausiai paplitusių operacijų, kurias atliekame kelis kartus per dieną. Ši paieška gali būti atliekama keliuose tinklalapiuose, esančiuose žiniatinklyje, arba muzikos programoje, ar kodų saugykloje, arba jų derinyje. Galima pagalvoti, kad paprasta reliacinė duomenų bazė taip pat gali padėti ieškoti. Tai yra teisinga. Tokios duomenų bazės kaip „MySQL“ palaiko viso teksto paiešką. Bet ką daryti žiniatinklyje ar muzikos programoje, kodų saugykloje ar jų visų derinyje? Duomenų bazė negali laikyti šių duomenų savo stulpeliuose. Net jei taip ir įvyko, užtruks nepriimtinai daug laiko, kol bus atlikta tokia didelė paieška.

Viso teksto paieškos sistema gali vykdyti paieškos užklausą vienu metu su milijonais failų. Greitis, kuriuo šiandien duomenys saugomi programoje, yra didžiulis. Vykdyti viso teksto paiešką naudojant tokio tipo duomenis yra nelengva užduotis. Taip yra todėl, kad mums reikalinga informacija gali būti viename faile iš milijardų žiniatinklyje saugomų failų.

Kaip veikia Lucene?

Akivaizdus klausimas, kuris jums turėtų kilti, yra tai, kaip „Lucene“ taip greitai vykdo viso teksto paieškos užklausas? Atsakymas į tai, žinoma, yra jo sukurtų indeksų pagalba. Tačiau užuot sukūrusi klasikinį indeksą, Lucene naudojasi Apversti indeksai.

Klasikinėje rodyklėje kiekvienam dokumentui renkame visą dokumente esančių žodžių ar terminų sąrašą. Apverstoje rodyklėje kiekvienam žodžiui visuose dokumentuose mes saugome, kokį dokumentą ir poziciją galima rasti šį žodį / terminą. Tai yra aukšto lygio algoritmas, kuris labai palengvina paiešką. Apsvarstykite šį klasikinio indekso kūrimo pavyzdį:

Doc1 -> "This", "is", "simple", "Lucene", "sample", "classic", "inverted", "index"
„Doc2“ -> „Veikia“, „Elasticsearch“, „Ubuntu“, „Atnaujinti“
Doc3 -> "RabbitMQ", "Lucene", "Kafka", "", "Pavasaris", "Batas"

Jei naudosime apverstą indeksą, turėsime tokius indeksus:

Tai -> (2, 71)
Liucena -> (1, 9), (12,87)
Apache -> (12, 91)
Karkasas -> (32, 11)

Apverstus indeksus yra daug lengviau išlaikyti. Tarkime, jei norime rasti „Apache“ pagal mano terminus, aš turėsiu tiesioginius atsakymus su apverstaisiais indeksais, o naudojant klasikinę paiešką bus atliekami išsamūs dokumentai, kurių galbūt nebuvo įmanoma vykdyti realiuoju laiku.

„Lucene“ darbo eiga

Kad „Lucene“ iš tikrųjų galėtų ieškoti duomenų, ji turi atlikti veiksmus. Vizualizuokime šiuos veiksmus, kad geriau suprastume:

„Lucene“ darbo eiga

Kaip parodyta diagramoje, taip nutinka „Lucene“:

  1. Lucene tiekiami dokumentai ir kiti duomenų šaltiniai
  2. Kiekviename dokumente „Lucene“ pirmiausia paverčia šiuos duomenis paprastu tekstu, o tada „Analyzers“ šį šaltinį paverčia paprastu tekstu
  3. Kiekvienam paprasto teksto terminui kuriami apversti indeksai
  4. Indeksai yra paruošti paieškai

Su šia darbo eiga „Lucene“ yra labai stipri viso teksto paieškos sistema. Bet tai vienintelė dalis, kurią įvykdo Lucene. Darbą turime atlikti patys. Pažvelkime į reikalingus indeksavimo komponentus.

„Lucene“ komponentai

Šiame skyriuje aprašysime pagrindinius komponentus ir pagrindines „Lucene“ klases, naudojamas indeksams kurti:

Paraiškos pavyzdys

Norėdami sukurti pavyzdinį projektą, naudosime vieną iš daugelio „Maven“ archetipų. Norėdami sukurti projektą, vykdykite šią komandą kataloge, kurį naudosite kaip darbo sritį:

mvn archetipas: generuoti -DgroupId = com.linuxhint.pavyzdys -DartifactId = LH-LuceneExample -DarchetypeArtifactId = maven-archetype-quickstart -DinteractiveMode = false

Jei „maven“ naudojate pirmą kartą, užtruks kelias sekundes, kol bus įvykdyta komanda generuoti, nes „maven“ turi atsisiųsti visus reikiamus papildinius ir artefaktus, kad būtų sukurta generavimo užduotis. Štai kaip atrodo projekto rezultatas:

Projekto sąranka

Sukūrę projektą, drąsiai atidarykite jį savo mėgstamiausiame IDE. Kitas žingsnis - pridėti atitinkamas „Maven Dependencies“ prie projekto. Čia yra pom.xml failas su atitinkamomis priklausomybėmis:



org.apache.liucenas
liuceno šerdis
4.6.0


org.apache.liucenas
įprasti liuceno analizatoriai
4.6.0

Galiausiai, norėdami suprasti visus JAR, kurie pridedami prie projekto, kai pridėjome šią priklausomybę, galime paleisti paprastą „Maven“ komandą, kuri leidžia mums pamatyti visą projekto priklausomybės medį, kai prie jo pridedame keletą priklausomybių. Čia yra komanda, kurią galime naudoti:

mvn priklausomybė: medis

Kai vykdysime šią komandą, ji parodys šį priklausomybės medį:

Galiausiai sukuriame „SimpleIndexer“ klasę, kuri veikia

paketas kom.linuxhint.pavyzdys;
importuoti java.t.Byla;
importuoti java.t.FileReader;
importuoti java.t.IOException;
importuoti org.apache.liucenas.analizė.Analizatorius;
importuoti org.apache.liucenas.analizė.standartas.„StandardAnalyzer“;
importuoti org.apache.liucenas.dokumentas.Dokumentas;
importuoti org.apache.liucenas.dokumentas.„StoredField“;
importuoti org.apache.liucenas.dokumentas.Teksto laukas;
importuoti org.apache.liucenas.indeksas.„IndexWriter“;
importuoti org.apache.liucenas.indeksas.„IndexWriterConfig“;
importuoti org.apache.liucenas.parduotuvė.FSDkatalogas;
importuoti org.apache.liucenas.util.Versija;
viešoji klasė „SimpleIndexer“
private static final String indexDirectory = "/ Vartotojai / shubham / kažkur / LH-LuceneExample / Index";
privati ​​statinė galutinė eilutė dirToBeIndexed = "/ Vartotojai / shubham / kažkur / LH-LuceneExample / src / main / java / com / linuxhint / example";
public static void main (String [] args) meta išimtį
Failas indexDir = naujas failas (indexDirectory);
Failo duomenysDir = naujas failas (dirToBeIndexed);
„SimpleIndexer“ indeksuotojas = naujas „SimpleIndexer“ ();
int numIndexed = indeksuotojas.indeksas (indexDir, dataDir);
Sistema.išėjo.println ("Iš viso indeksuotų failų" + numIndexed);

privatus int indeksas (File indexDir, File dataDir) išmeta IOException
Analizatoriaus analizatorius = naujas „StandardAnalyzer“ (versija.LUCENE_46);
. = Nauja IndexWriterConfig (versija.LUCENE_46,
analizatorius);
= New IndexWriter (FSD Directory.atidaryti (indexDir),
konfigūruoti);
Failas [] failai = dataDir.listFiles ();
skirtas (failas f: failai)
Sistema.išėjo.println ("Failo indeksavimas" + f.getCanonicalPath ());
Document doc = naujas dokumentas ();
doc.pridėti (naujas „TextField“ („turinys“, naujas „FileReader“ (f)));
doc.pridėti (naujas „StoredField“ („fileName“, f.getCanonicalPath ()));
indexWriter.addDocument (doc);

int numIndexed = indexWriter.„maxDoc“ ();
indexWriter.Uždaryti();
grąžinti numIndexed;

Šiame kode mes ką tik sukūrėme dokumento egzempliorių ir pridėjome naują lauką, kuris nurodo failo turinį. Štai rezultatas, kurį gauname paleidę šį failą:

Rodyklės failas / Vartotojai / shubham / kažkur / LH-LuceneExample / src / main / java / com / linuxhint / example / SimpleIndexer.java
Iš viso indeksuotų failų 1

Taip pat projekte sukuriamas naujas katalogas su tokiu turiniu:

Rodyklės duomenys

Mes analizuosime, kokie failai yra sukurti šiame rodyklėje, per kitas „Lucene“ pamokas.

Išvada

Šioje pamokoje mes apžvelgėme, kaip veikia „Apache Lucene“, taip pat sukūrėme paprastą pavyzdinę programą, pagrįstą „Maven“ ir „Java“.

Kaip rodyti OSD perdangą viso ekrano „Linux“ programose ir žaidimuose
Žaisdami viso ekrano žaidimus arba naudodamiesi programomis be išsiblaškymo viso ekrano režimu, galite nutraukti nuo susijusios sistemos informacijos,...
5 geriausios žaidimų fiksavimo kortos
Visi mes matėme ir pamėgome srautinius žaidimus „YouTube“. „PewDiePie“, „Jakesepticye“ ir „Markiplier“ yra tik vieni iš geriausių žaidėjų, kurie uždir...
Kaip sukurti žaidimą „Linux“
Prieš dešimtmetį nedaugelis „Linux“ vartotojų numatė, kad jų mėgstama operacinė sistema vieną dieną bus populiari komercinių vaizdo žaidimų žaidimų pl...