120 likes | 332 Views
Apache Lucene http://lucene.apache.org/. Biblioteka za pretragu informacija. Pretraga teksta, osnove API i primeri korišćenja. Šta je Apache Lucene?.
E N D
Apache Lucenehttp://lucene.apache.org/ • Biblioteka za pretragu informacija. Pretraga teksta, osnove API i primeri korišćenja
Šta je Apache Lucene? • Nije alat za pretragu, već biblioteka, API koji daje strukture podataka i procedure koje nam omogućavaju da u aplikaciju ugradimo funkcije pretrage (information retrieval - IR) • Razvoj počeo oko 2000. godine (Doug Cutting), brzo stečena popularnost • Trenutno u verziji 3.4. Najpopularnija Java biblioteka te namene. Brojni komercijalni i open-source projekti zasnovani na Lucene • Postoje implementacije i u drugim jezicima (.NET, Ruby, Perl, Python, C++...)
Indeksiranje • Često slušamo o indeksima pri pretraživanju. • Nije naročito zahtevno pretražiti sekvencijalno jedan dokument. Ako je broj veći, potrebna nam je pomoćna struktura - indeks. • Indeksi na kraju knjiga beleže stranice gde se pojavljuju značajne reči i izrazi • Indeks smanjuje obim pretrage i daje lokaciju traženih reči
Lucene indeksi • Lucene indeks se čuva na fajl sistemu i sadrži podatke bitne za pretragu dokumenata • Klasa org.apache.lucene.document.Document predstavlja osnovnu jedinicu koja se analizira, smešta u indeks i pretražuje • Jedan dokument može sadržati jedno ili više polja (org.apache.lucene.document.Field). Polja su svojstva dokumenta koja se pretražuju ili služe kao opisni podaci • Upiti nalaze dokumente čija polja imaju određene vrednosti (slobodan tekst, brojevi, datumi...) ili su u nekom opsegu • Analogija sa knjigom i traženjem pojma u indeksu: dokument je jedna stranica, polje je broj strane, kao i tekstualni sadržaj te strane (ali obrađen)
Indeksiranje u praksi • Naše dokumente prevodimo u “sirovi tekst” - razne biblioteke za parsiranje i izdvajanje teksta iz raznih formata • Lucene tekst parsira, pretvara u tokene i analizira za indeksiranje (stop reči, svođenje reči na koren i druge operacije specifične za svaki jezik) • Dokumentu pridružujemo kao polja druge relevantne informacije vezane za dokument (datum, neki identifikator...) • Dokument se smešta u indeks • Indeks može biti na fajl sistemu (FSDirectory) ili u RAM (RAMDirectory)
Primer • Pretražujemo HTML dokumente u nekom direktorijumu • Jedan HTML fajl predstavljaće jedan Lucene dokument • Polja: tekst (iz HTML BODY), naslov (TITLE) i putanja na fajl sistemu • Pretražujemo po naslovu i po tekstualnom sadržaju. • Rezultat vraća putanju i naslov • Radimo sa dva indeksa - jedan je u RAM i služi kao bafer, drugi je na fajl sistemu i u njega na svakih 100 dokumenata ubacujemo (spajamo, merge u Lucene terminologiji) indeks koji je u RAM
Šta radi Analyser? • Zavisi koji (StandardAnalyser, StopAnalyser...). Postoje jednostavniji i složeniji. • Uopšteno iz teksta dokumenta izdvaja tokene koje vredi indeksirati, ne ubacivati u indeks suvišne reči • Npr. StandardAnalyser će leksičkom analizom izdvojiti pojedine reči, ukloniti stop reči engleskog jezika, prepoznati e-mail adrese, nazive kompanija, reči koje sadrže apostrofe, svodi reči na koren, osnovni oblik, uklanja akcente i svodi na mala slova... Radi i sa istočnim pismima (Kina, Japan, Koreja), a isprobano i sa domaćom latinicom i ćirilicom :) • Sandbox projekti nude dodatne analizatore • Kao i sve u vezi pretrage, izbor analizatora zavisi od konkretnih potreba
Od tokena ka indeksu • Tokeni odlaze u indeks i postaju Term - vrednosti na osnovu kojih se vraćaju rezultati pretrage • Ne mora svako polje da bude analizirano - neka mogu da budu uneta sa tačnim vrednostima i da kao takva budu pretraživana • Ako želimo da brzo rekonstruišemo indeksiranu vrednost, i vrednost je relativno mala, možemo je celu čuvati u indeksu. Npr. neki datum, naslov, ime fajla itd. • Analizator može biti drugačiji od dodeljenog IndexWriteru za određeni dokument
Upiti • Bogat Query API - jednakost, slilčnost, opsezi vrednosti, wildcard • Kombinovanje upita • QueryParser: formira upit od unetog stringa • IndexSearcher pretražuje indeks na zadati upit • Collector i Hits objekti prikupljaju i rangiraju rezultate (ne cele dokumente, već samo interne id-eve dokumenata) • Možemo dobiti dokument upitom nad indeksom koristeći id dokumenta
Segmenti • Dodavanje i brisanje dokumenata se vrši inkrementalno • Jedan segment je grupa indeksiranih dokumenata • Dokumenti se dodaju u tekući indeks i periodično spajaju sa drugim segmentima • Optimizacije (broj segmenata, broj dokumenata po segmentu...) • Spajanje više indeksa
Druga pitanja vezana za indeksiranje • Konkurentnost u pristupu: moguće je pretraživati indeks dok je u toku upisivanje • Transakciono ponašanje • Paralelni rad sa više indeksa (FS ili RAM) • Optimizacija - brzina indeksiranja, brzina pretrage • Prostor na disku i broj otvorenih fajlova • Backup
Najbolje da probate sami :) • Par jar biblioteka (Lucene, nešto Apache Commons, neki parser za HTML, PDF, MS Word...) • Gomila dokumenata • Igrajte se • Dosta tutoriala, primera, knjiga Lucene in Action... • Probajte nešto od dodatnih biblioteka koje dolaze uz Lucene • Probajte i druge stvari (solr server, Tika...)