Programiranje

Iskalnik Lucene: zmogljiv, prilagodljiv in brezplačen

Naj vas nizka številka različice - 0,04 od avgusta 2000 - ne zavede. Iskalnik Lucene je robusten, zmogljiv in prilagodljiv komplet orodij za iskanje, ki je pripravljen rešiti številne pogoste težave pri iskanju. In ker je zdaj na voljo pod prožnejšo odprtokodno licenco LGPL, je tudi cena (brezplačna!) Prava.

Doug Cutting, izkušen razvijalec orodij za iskanje in iskanje besedil, je ustvaril Lucene. Cutting je glavni avtor iskalnika V-Twin (del napora Appleovega operacijskega sistema Copland) in je trenutno višji arhitekt pri Excite. Lucene je zasnoval tako, da je olajšal dodajanje možnosti indeksiranja in iskanja številnim aplikacijam, med drugim:

  • E-poštni naslov, ki ga je mogoče iskati: E-poštna aplikacija lahko uporabnikom dovoli iskanje po arhiviranih sporočilih in dodajanje novih sporočil v indeks, ko prispejo.
  • Iskanje po spletni dokumentaciji: Bralnik dokumentacije - na CD-ju, na spletu ali vgrajen v aplikacijo - lahko uporabnikom omogoča iskanje po spletni dokumentaciji ali arhiviranih publikacijah.
  • Spletne strani, ki jih je mogoče iskati: Spletni brskalnik ali proxy strežnik bi lahko zgradil osebni iskalnik za indeksiranje vsake spletne strani, ki jo je uporabnik obiskal, kar uporabnikom omogoča enostavno obiskovanje strani.
  • Iskanje po spletni strani: Program CGI lahko uporabnikom omogoči iskanje po vašem spletnem mestu.
  • Iskanje vsebine: Aplikacija lahko uporabniku dovoli iskanje po shranjenih dokumentih za določeno vsebino; to bi lahko vključili v pogovorno okno Odpri dokument.
  • Nadzor različic in upravljanje vsebine: Sistem za upravljanje dokumentov lahko indeksira dokumente ali različice dokumentov, tako da jih je mogoče enostavno pridobiti.
  • Viri novic in žičnih storitev: Novinarski strežnik ali rele lahko članke indeksira, ko prispejo.

Številni iskalniki bi lahko seveda izvajali večino teh funkcij, a le malo odprtokodnih iskalnih orodij ponuja Lucenovo enostavnost uporabe, hitro izvajanje in prilagodljivost.

Lucene sem prvič uporabil pri razvoju Eyebrowse, odprtokodnega orodja na Javi za katalogiziranje in brskanje po poštnih seznamih. (Glejte Vire za povezavo.) Osnovna zahteva za Eyebrowse je bila prilagodljivo iskanje in iskanje sporočil. Zahtevala je komponento indeksiranja in iskanja, ki bi učinkovito posodabljala indeksno bazo, ko prispejo nova sporočila, omogočala več uporabnikom, da istočasno iščejo in posodabljajo indeksno bazo in merila na arhive, ki vsebujejo milijone sporočil.

Vsak drugi odprtokodni iskalnik, ki sem ga ocenil, vključno s Swish-E, Glimpse, iSearch in libibex, je bil na nek način slabo prilagojen zahtevam Eyebrowse. Zaradi tega bi integracija postala problematična in / ali dolgotrajna. Z Lucene sem v nekaj več kot pol dneva, od začetnega prenosa do popolnoma delujoče kode, orodju Eyebrowse dodal indeksiranje in iskanje! To je bila manj kot desetina razvojnega časa, ki sem ga predvideval, in je prinesel tesneje integriran in s funkcijami bogat rezultat kot katero koli drugo orodje za iskanje, ki sem ga imel v mislih.

Kako delujejo iskalniki

Ustvarjanje in vzdrževanje obrnjen indeks je osrednji problem pri gradnji učinkovitega iskalnika ključnih besed. Če želite dokument indeksirati, ga morate najprej optično prebrati, da dobite seznam napotitve. Objave opisujejo pojav besede v dokumentu; na splošno vključujejo besedo, ID dokumenta in po možnosti lokacijo ali pogostost besede v dokumentu.

Če menite, da so objave nabora oblike , bo niz dokumentov dal seznam objav, razvrščenih po ID-ju dokumenta. Toda za učinkovito iskanje dokumentov, ki vsebujejo določene besede, raje razvrstite objave po besedah ​​(ali po besedah ​​in dokumentih, kar bo pospešilo iskanje po večbesednih besedah). V tem smislu je gradnja iskalnega indeksa v bistvu problem razvrščanja. Iskalni indeks je seznam objav, razvrščenih po besedah.

Inovativna izvedba

Večina iskalnikov uporablja B-drevesa za vzdrževanje indeksa; so relativno stabilni glede na vstavljanje in imajo dobro obnašane V / I značilnosti (iskanje in vstavljanje sta operaciji O (log n)). Lucene ima nekoliko drugačen pristop: namesto da bi ohranil en indeks, zgradi več segmentov indeksa in jih občasno združi. Za vsak indeksiran nov dokument Lucene ustvari nov indeksni segment, vendar majhne segmente hitro združi z večjimi - tako ostane skupno število segmentov majhno, tako da ostane iskanje hitro. Za optimizacijo indeksa za hitro iskanje lahko Lucene združi vse segmente v enega, kar je koristno za redko posodobljene indekse. Da bi preprečil konflikte (ali zaklepanje režijskih stroškov) med bralci indeksov in zapisovalci, Lucene nikoli ne spreminja segmentov, temveč samo ustvarja nove. Ko združuje segmente, Lucene napiše nov segment in izbriše stare, potem ko ga zaprejo aktivni bralci. Ta pristop se dobro prilagaja, ponuja razvijalcu visoko stopnjo prilagodljivosti pri trgovanju s hitrostjo indeksiranja za hitrost iskanja in ima zaželene V / I značilnosti tako za združevanje kot za iskanje.

Segment indeksa Lucene je sestavljen iz več datotek:

  • Kazalo slovarja, ki vsebuje en vnos za vsakih 100 vnosov v slovar
  • Slovar, ki vsebuje en vnos za vsako unikatno besedo
  • Datoteka z objavami, ki vsebuje vnos za vsako objavo

Ker Lucene nikoli ne posodobi segmentov, jih je mogoče shraniti v ravne datoteke namesto v zapletene B-drevesa. Za hiter dostop indeks slovarja vsebuje odmike v slovarski datoteki, slovar pa vsebuje odmike v datoteki knjiženja. Lucene izvaja tudi različne trike za stiskanje slovarja in objavljanje datotek - s čimer se zmanjša vhodno / izhodni prenos diska - ne da bi pri tem prišlo do znatnih stroškov CPU.

Ocenjevanje iskalnikov

Drugi široko uporabljani odprtokodni iskalniki vključujejo Swish-E, Glimpse, libibex, freeWAIS in iSearch. Kot vsak programski paket je tudi vsak optimiziran za uporabo v določenih situacijah; pogosto je težko uporabiti ta orodja zunaj predvidenih domen. Pri ocenjevanju iskalnika upoštevajte naslednje funkcije:

  • Inkrementalno in šaržno indeksiranje: Nekateri iskalniki podpirajo samo paketno indeksiranje; ko enkrat ustvarijo indeks za niz dokumentov, dodajanje novih dokumentov postane težko brez ponovnega indeksiranja vseh dokumentov. Inkrementalno indeksiranje omogoča enostavno dodajanje dokumentov v obstoječi indeks. Za nekatere programe, na primer za obdelavo virov podatkov v živo, je postopno indeksiranje ključnega pomena. Lucene podpira obe vrsti indeksiranja.
  • Viri podatkov: Številni iskalniki lahko indeksirajo samo datoteke ali spletne strani. To ovira aplikacije, pri katerih indeksirani podatki prihajajo iz baze podatkov ali kadar v eni datoteki obstaja več navideznih dokumentov, na primer arhiv ZIP. Lucene razvijalcem omogoča, da dokument dostavijo indeksatorju prek a Vrvica ali an InputStream, ki dovoljuje abstrakcijo vira podatkov iz podatkov. Vendar mora razvijalec s tem pristopom zagotoviti ustrezne bralce podatkov.
  • Nadzor indeksiranja: Nekateri iskalniki lahko samodejno plazijo po drevesu imenikov ali spletnem mestu in poiščejo dokumente za indeksiranje. Čeprav je to priročno, če so vaši podatki že shranjeni na ta način, indeksatorji, ki temeljijo na pajkih, pogosto zagotavljajo omejeno prilagodljivost za aplikacije, ki zahtevajo natančen nadzor nad indeksiranimi dokumenti. Ker Lucene deluje predvsem v postopnem načinu, aplikaciji omogoča iskanje in pridobivanje dokumentov.
  • Formati datotek: Nekateri iskalniki lahko indeksirajo samo besedilo ali dokumente HTML; drugi podpirajo mehanizem filtriranja, ki ponuja preprosto alternativo indeksiranju dokumentov za obdelavo besedil, dokumentov SGML in drugih formatov datotek. Lucen podpira tak mehanizem.
  • Označevanje vsebine: Nekateri iskalniki obravnavajo dokument kot en sam tok žetonov; drugi omogočajo specifikacijo več podatkovnih polj v dokumentu, kot so "zadeva", "povzetek", "avtor" in "telo". To omogoča semantično bogatejše poizvedbe, kot je "avtor" vsebuje Hamilton IN telo vsebuje Ustava. "Lucene podpira označevanje vsebine tako, da dokumente obravnava kot zbirke polj in podpira poizvedbe, ki določajo, v katerih poljih je treba iskati.
  • Stop-word obdelava: Pogoste besede, kot so "a", "in" in "the," dodajo malo vrednosti iskalnemu indeksu. Ker pa so te besede tako pogoste, bo njihovo katalogiziranje znatno prispevalo k času indeksiranja in velikosti indeksa. Večina iskalnikov določenih besed ne bo indeksirala stop besede. Nekateri uporabljajo seznam zaustavitvenih besed, drugi pa statistične besede izberejo. Lucene obravnava stop besede z bolj splošnimi Analizator mehanizem, ki bo opisan kasneje, in vsebuje StopAnalyzer razred, ki iz vhodnega toka odstrani zaustavitvene besede.
  • Zarezovanje: Uporabnik pogosto želi, da se poizvedba ene besede ujema z drugimi podobnimi besedami. Na primer, poizvedba za "skok" bi se verjetno morala ujemati tudi z besedami "skočil", "skakalec" ali "skoki". Imenuje se redukcija besede v njeno korensko obliko ki izvirajo. Lucene še ne uporablja zarezovanja, vendar bi lahko brez težav dodali orožje z bolj izpopolnjenim Analizator razred.
  • Funkcije poizvedbe: Iskalniki podpirajo različne funkcije poizvedb. Nekateri podpirajo polne logične poizvedbe; drugi podpirajo samo in poizvedbe. Nekateri vrnejo rezultat "ustreznosti" z vsakim zadetkom. Nekateri lahko obravnavajo poizvedbe glede sosedstva ali bližine - "iskanje čemur sledi motor "ali" Knicks blizu Celtics "- drugi lahko iščejo samo po posameznih ključnih besedah. Nekateri lahko poiščejo več indeksov hkrati in združijo rezultate, da dobijo pomemben rezultat ustreznosti. Lucene podpira široko paleto funkcij poizvedb, vključno z vsemi zgoraj naštetimi. Vendar Lucene ne ne podpirajo dragocene Soundex ali poizvedbe "zveni kot".
  • Sočasnost: Ali lahko več uporabnikov hkrati išče po indeksu? Ali lahko uporabnik išče indeks, medtem ko ga drugi posodablja? Lucene omogoča uporabnikom, da transakcijsko iščejo po indeksu, tudi če ga hkrati posodablja drug uporabnik.
  • Neangleška podpora: Številni iskalniki implicitno domnevajo, da je ciljni jezik angleščina; to je razvidno na področjih, kot so seznami zaustavitvenih besed, izvorni algoritmi in uporaba bližine za ujemanje fraznih poizvedb. Ko Lucene vnaprej obdela vhodni tok skozi Analizator razreda, ki ga je zagotovil razvijalec, je mogoče izvesti filtriranje, specifično za jezik.

Čeprav nikakor ni izčrpen, zgornji seznam ponuja izhodišče za ocenjevanje iskalnika za določen projekt. Nekatera orodja za iskanje so slabo primerna za določene naloge - razumevanje zahtev vaše aplikacije vam lahko pomaga izbrati pravo orodje za delo.

Uporaba lucena

Ilustriral bom, kako uporabiti Lucene za ustvarjanje, izpolnjevanje in iskanje indeksa. Zaradi jasnosti so stavki o uvozu in obdelava izjem izpuščeni iz vzorčnih programov. Na teh ilustracijah sem indeks iskanja shranil v datotečni sistem (indekse lahko shranite kjer koli, npr. V pomnilnik ali v bazo podatkov). Datoteke, ki se indeksirajo, so preproste besedilne datoteke. Z Lucene lahko enostavno indeksirate tudi druge oblike dokumentov in dokumente, ki niso shranjeni v datotekah.

Ustvari indeks

Preprost program CreateIndex.java ustvari prazen indeks z generiranjem IndexWriter objekt in mu naroči, naj gradi prazen indeks. V tem primeru je v ukazni vrstici določeno ime imenika, v katerem bo shranjen indeks.

javni razred CreateIndex {// uporaba: CreateIndex indeksni imenik public static void main (String [] args) vrže izjemo {String indexPath = args [0]; Pisec IndexWriter; // Indeks se ustvari tako, da odpre IndexWriter z argumentom // create, nastavljenim na true. zapisovalnik = new IndexWriter (indexPath, null, true); writer.close (); }} 

Kazalo besedilnih dokumentov

IndexFile.java prikazuje, kako v indeks dodati dokumente - datoteke, poimenovane v ukazni vrstici. Za vsako datoteko IndexFiles ustvari a Dokument predmet, nato klice IndexWriter.addDocument da ga dodate v indeks. Z vidika Lucene a Dokument je zbirka polj, ki so pari ime-vrednost. A Polje lahko svojo vrednost pridobi iz a Vrvica, za kratka polja ali InputStream, za dolga polja. Uporaba polj omogoča razdelitev dokumenta na ločeno iskane in indeksirane odseke ter metapodatke - na primer ime, avtor ali datum spremembe - z dokumentom. Na primer, pri shranjevanju poštnih sporočil lahko postavite zadevo, avtorja, datum in telo sporočila v ločena polja, nato pa zgradite semantično bogatejše poizvedbe, kot je "zadeva" vsebuje Java IN avtor vsebuje Gosling. "V spodnji kodi v vsako shranimo dve polji Dokument: pot, da prepozna izvorno pot datoteke, da jo bo mogoče pozneje pridobiti, in telo, za vsebino datoteke.

javni razred IndexFiles {// uporaba: datoteka indeksne poti IndexFiles. . . public static void main (String [] args) vrže izjemo {String indexPath = args [0]; Pisec IndexWriter; Writer = new IndexWriter (indexPath, new SimpleAnalyzer (), false); za (int i = 1; i
$config[zx-auto] not found$config[zx-overlay] not found