apache lucene lucene.apache
Post on 30-Dec-2015
136 Views
Preview:
DESCRIPTION
TRANSCRIPT
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
• 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
Druga pitanja vezana za indeksiranje
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...)
top related