Kāpēc Lucene ir vajadzīga?
Meklēšana ir viena no visbiežāk izmantotajām operācijām, ko veicam vairākas reizes dienā. Šis meklējums var notikt vairākās tīmekļa lapās, kas pastāv tīmeklī, mūzikas lietojumprogrammā vai kodu krātuvē, vai visu šo kombinācijā. Varētu domāt, ka vienkārša relāciju datu bāze var arī atbalstīt meklēšanu. Tas ir pareizi. Tādas datu bāzes kā MySQL atbalsta pilna teksta meklēšanu. Bet ko par tīmekli vai mūzikas lietojumprogrammu, vai kodu krātuvi vai visu to kombināciju? Datu bāze nevar saglabāt šos datus savās slejās. Pat ja tas tā notika, tikpat ilgs laiks būs nepieciešams, lai palaistu meklējumus.
Pilna teksta meklētājprogramma spēj izpildīt meklēšanas vaicājumu miljoniem failu vienlaikus. Ātrums, kādā šodien dati tiek saglabāti lietojumprogrammā, ir milzīgs. Palaist pilna teksta meklēšanu šāda veida datu apjomā ir grūts uzdevums. Tas ir tāpēc, ka mums vajadzīgā informācija var sastāvēt no viena faila no miljardiem tīmeklī saglabāto failu.
Kā darbojas Lucene?
Acīmredzams jautājums, kas jums būtu jāienāk prātā, ir, kā Lucene tik ātri izpilda pilna teksta meklēšanas vaicājumus? Atbilde uz to, protams, ir ar izveidoto indeksu palīdzību. Bet tā vietā, lai izveidotu klasisko indeksu, Lucene izmanto Apgrieztie indeksi.
Klasiskajā rādītājā katram dokumentam mēs apkopojam pilnu vārdu vai vārdu sarakstu, kas ir dokumentā. Apgrieztā rādītājā katram vārdam visos dokumentos mēs glabājam, kādā dokumentā un pozīcijā šo vārdu / terminu var atrast. Šis ir augsta līmeņa algoritms, kas ļoti atvieglo meklēšanu. Apsveriet šādu klasiskā indeksa izveides piemēru:
Doc1 -> "This", "is", "simple", "Lucene", "sample", "classic", "inverted", "index"Doc2 -> "Darbojas", "Elasticsearch", "Ubuntu", "Atjaunināt"
Doc3 -> "RabbitMQ", "Lucene", "Kafka", "", "Pavasaris", "Boot"
Ja izmantosim apgriezto indeksu, mums būs šādi indeksi:
Šis -> (2, 71)Lucēna -> (1, 9), (12,87)
Apache -> (12, 91)
Sistēma -> (32, 11)
Apgrieztus indeksus ir daudz vieglāk uzturēt. Pieņemsim, ka, ja mēs vēlamies atrast Apache manos terminos, man būs tūlītējas atbildes ar apgrieztiem indeksiem, turpretī klasiskā meklēšana darbosies ar pilnīgiem dokumentiem, kurus, iespējams, nebija iespējams izpildīt reāllaika scenārijos.
Lucene darbplūsma
Pirms Lucene faktiski var meklēt datus, tai jāveic darbības. Vizualizēsim šīs darbības, lai labāk izprastu:
Lucene darbplūsma
Kā parādīts diagrammā, Lucene notiek šādi:
- Lucene tiek padota ar dokumentiem un citiem datu avotiem
- Katram dokumentam Lucene vispirms pārveido šos datus par vienkāršu tekstu, bet pēc tam Analyzers pārvērš šo avotu par vienkāršu tekstu
- Katram vārdam vienkāršajā tekstā tiek izveidoti apgrieztie indeksi
- Indeksi ir gatavi meklēšanai
Ar šo darbplūsmu Lucene ir ļoti spēcīga pilna teksta meklētājprogramma. Bet tikai šo daļu Lucene izpilda. Mums pašiem jāveic darbs. Apskatīsim nepieciešamos indeksēšanas komponentus.
Lucene komponenti
Šajā sadaļā mēs aprakstīsim pamatkomponentus un Lucene pamatklases, kas izmantotas indeksu izveidošanai:
- Katalogi: Lucene indekss datus glabā parastos failu sistēmas direktorijos vai atmiņā, ja jums nepieciešama lielāka veiktspēja. Lietotņu izvēle ir glabāt datus, kur vien vēlaties, datu bāzi, operatīvo atmiņu vai disku.
- Dokumenti: Dati, kurus mēs padodam Lucene dzinējam, jāpārvērš vienkāršā tekstā. Lai to izdarītu, mēs izveidojam objektu Document, kas pārstāv šo datu avotu. Vēlāk, palaižot meklēšanas vaicājumu, mēs iegūsim to dokumentu objektu sarakstu, kas apmierina mūsu nodoto vaicājumu.
- Lauki: Dokumenti ir aizpildīti ar lauku kolekciju. Lauks ir vienkārši pāris (nosaukums, vērtība) preces. Tātad, veidojot jaunu dokumenta objektu, mums tas jāaizpilda ar šāda veida pāra datiem. Kad lauks ir apgriezti indeksēts, lauka vērtība tiek marķēta un ir pieejama meklēšanai. Kamēr mēs izmantojam laukus, nav svarīgi saglabāt faktisko pāri, bet tikai apgriezto indeksēto. Tādā veidā mēs varam izlemt, kuri dati ir meklējami tikai un kurus nav svarīgi saglabāt. Apskatīsim piemēru šeit:
Lauka indeksēšana
Iepriekš tabulā mēs nolēmām dažus laukus uzglabāt, bet citi netiek glabāti. Ķermeņa lauks netiek saglabāts, bet indeksēts. Tas nozīmē, ka e-pasts tiks atgriezts, kad tiks izpildīts vaicājums vienam no noteikumiem par ķermeņa saturu.
- Noteikumi: Termini apzīmē vārdu no teksta. Tādējādi termini tiek iegūti no lauku vērtību analīzes un tokenizācijas Termins ir mazākā vienība, kurā tiek veikta meklēšana.
- Analizatori: Analizators ir vissvarīgākā indeksēšanas un meklēšanas procesa daļa. Tas ir analizators, kas vienkāršo tekstu pārveido par žetoniem un noteikumiem, lai tos varētu meklēt. Nu, tas nav vienīgais analizatora pienākums. Analizators žetonu izgatavošanai izmanto marķieri. Analizators veic arī šādus uzdevumus:
- Stemming: Analyzer pārveido vārdu kāts. Tas nozīmē, ka "ziedi" tiek pārveidoti par cilmes vārdu "zieds". Tātad, kad tiek veikta vaicājuma “zieds” meklēšana, dokuments tiks atgriezts.
- Filtrēšana: Analizators filtrē arī apturēšanas vārdus, piemēram, "The", "is" utt. jo šie vārdi nepiesaista nevienu vaicājumu, kas būtu jāpilda, un nav produktīvi.
- Normalizācija: Šis process noņem akcentus un citus rakstzīmju marķējumus.
Tas ir tikai parasts StandardAnalyzer pienākums.
Lietojumprogrammas piemērs
Mēs izmantosim vienu no daudzajiem Maven arhetipiem, lai izveidotu sava parauga projektu. Lai izveidotu projektu, izpildiet šādu komandu direktorijā, kuru izmantosiet kā darbvietu:
mvn arhetips: ģenerēt -DgroupId = com.linuxhint.piemērs -DartifactId = LH-LuceneExample -DarchetypeArtifactId = maven-archetype-quickstart -DinteractiveMode = falseJa jūs pirmo reizi izmantojat maven, ģenerēšanas komandas izpilde prasīs dažas sekundes, jo maven ir jālejupielādē visi nepieciešamie spraudņi un artefakti, lai izveidotu ģenerēšanas uzdevumu. Lūk, kā izskatās projekta rezultāts:
Projekta iestatīšana
Kad esat izveidojis projektu, droši atveriet to savā iecienītajā IDE. Nākamais solis ir projektam pievienot atbilstošas Maven Dependencies. Šeit ir pom.xml fails ar atbilstošajām atkarībām:
Visbeidzot, lai saprastu visus JAR, kas tiek pievienoti projektam, pievienojot šo atkarību, mēs varam palaist vienkāršu Maven komandu, kas ļauj mums redzēt pilnu projekta Atkarības koku, kad tam pievienojam dažas atkarības. Šeit ir komanda, kuru mēs varam izmantot:
mvn atkarība: koksPalaidot šo komandu, tā parādīs mums šādu atkarības koku:
Visbeidzot, mēs izveidojam SimpleIndexer klasi, kas darbojas
ievest java.io.Fails;
ievest java.io.FileReader;
ievest java.io.IOException;
importēt org.apache.lucēns.analīze.Analizators;
importēt org.apache.lucēns.analīze.standarta.StandardAnalyzer;
importēt org.apache.lucēns.dokumentu.Dokuments;
importēt org.apache.lucēns.dokumentu.StoredField;
importēt org.apache.lucēns.dokumentu.TextField;
importēt org.apache.lucēns.indekss.IndexWriter;
importēt org.apache.lucēns.indekss.IndexWriterConfig;
importēt org.apache.lucēns.veikalā.FSD direktorijs;
importēt org.apache.lucēns.util.Versija;
publiskā klase SimpleIndexer
privāta statiska galīgā virknes indexDirectory = "/ Lietotāji / šubhems / kaut kur / LH-LuceneExample / Index";
privāta statiska gala virkne dirToBeIndexed = "/ Lietotāji / shubham / kaut kur / LH-LuceneExample / src / main / java / com / linuxhint / example";
public static void main (String [] args) izmet izņēmumu
File indexDir = jauns fails (indexDirectory);
File dataDir = jauns fails (dirToBeIndexed);
SimpleIndexer indeksētājs = jauns SimpleIndexer ();
int numIndexed = indeksētājs.indekss (indexDir, dataDir);
Sistēma.ārā.println ("Kopējais indeksēto failu skaits" + numIndexed);
privāts int indekss (File indexDir, File dataDir) iemet IOException
Analizatora analizators = jauns StandardAnalyzer (versija.LUCENE_46);
IndexWriterConfig config = new IndexWriterConfig (versija.LUCENE_46,
analizators);
IndexWriter indexWriter = jauns IndexWriter (FSD Directory.atvērt (indexDir),
config);
File [] faili = dataDir.listFiles ();
domēnam (fails f: faili)
Sistēma.ārā.println ("Faila indeksēšana" + f.getCanonicalPath ());
Dokuments doc = jauns dokuments ();
doc.pievienot (jauns TextField ("saturs", jauns FileReader (f)));
doc.pievienot (jauns StoredField ("fileName", f.getCanonicalPath ()));
indexWriter.addDocument (doc);
int numIndexed = indexWriter.maxDoc ();
indexWriter.aizvērt ();
atgriezt numIndexed;
Šajā kodā mēs tikko izveidojām dokumenta instanci un pievienojām jaunu lauku, kas apzīmē faila saturu. Lūk, izeja, kuru mēs iegūstam, palaižot šo failu:
Indeksēšanas fails / Lietotāji / shubham / kaut kur / LH-LuceneExample / src / main / java / com / linuxhint / example / SimpleIndexer.javaIndeksēto failu kopskaits 1
Turklāt projekta ietvaros tiek izveidots jauns direktorijs ar šādu saturu:
Indeksa dati
Mēs analizēsim, kādi visi faili ir izveidoti šajā rādītājā, vēl vairāk mācību stundu par Lucene.
Secinājums
Šajā nodarbībā mēs apskatījām, kā darbojas Apache Lucene, un mēs izveidojām arī vienkāršu piemēru, kura pamatā bija Maven un java.