Programovanie

Vyhľadávač Lucene: Výkonný, flexibilný a bezplatný

Nenechajte sa oklamať nízkym číslom verzie - 0,04 z augusta 2000. Vyhľadávací modul Lucene je robustný, výkonný a flexibilný vyhľadávací nástroj, ktorý je pripravený vyriešiť mnoho bežných problémov s vyhľadávaním. A keďže je teraz k dispozícii pod flexibilnejšou licenciou LGPL open source, cena (zadarmo!) Je tiež správna.

Doug Cutting, skúsený vývojár nástrojov na vyhľadávanie a vyhľadávanie textu, vytvoril Lucene. Cutting je hlavným autorom vyhľadávacieho nástroja V-Twin (súčasť úsilia operačného systému Copland od spoločnosti Apple) a v súčasnosti je senior architektom spoločnosti Excite. Navrhol program Lucene, aby uľahčil pridanie možnosti indexovania a vyhľadávania do širokej škály aplikácií vrátane:

  • E-mail s možnosťou vyhľadávania: E-mailová aplikácia umožňuje používateľom prehľadávať archivované správy a pridávať nové správy do indexu hneď po ich doručení.
  • Online vyhľadávanie dokumentácie: Čítačka dokumentácie - na CD, na webe alebo vložená do aplikácie - môže používateľom umožniť prehľadávať dokumentáciu online alebo archivované publikácie.
  • Vyhľadávateľné webové stránky: Webový prehľadávač alebo server proxy by mohol vytvoriť osobný vyhľadávací nástroj na indexovanie každej webovej stránky, ktorú používateľ navštívil, čo by používateľom umožnilo jednoduché opätovné navštívenie stránok.
  • Vyhľadávanie na webe: Program CGI môže používateľom umožniť prehľadávať vaše webové stránky.
  • Vyhľadávanie obsahu: Aplikácia môže umožniť používateľovi vyhľadávať v uložených dokumentoch konkrétny obsah; toto by sa dalo integrovať do dialógového okna Otvoriť dokument.
  • Kontrola verzií a správa obsahu: Systém správy dokumentov môže indexovať dokumenty alebo verzie dokumentov, aby sa dali ľahko načítať.
  • Novinky a informačné kanály o bankových službách: Spravodajský server alebo server na prenos mohli indexovať články hneď, ako dorazia.

Mnohé z týchto vyhľadávacích nástrojov by samozrejme mohlo vykonávať väčšinu týchto funkcií, ale len málo nástrojov na vyhľadávanie v otvorenom zdroji ponúka jednoduché použitie, rýchlu implementáciu a flexibilitu Lucene.

Prvýkrát som použil Lucene pri vývoji Eyebrowse, open source nástroja založeného na prostredí Java na katalogizáciu a prezeranie zoznamov adries. (Odkaz nájdete v časti Zdroje.) Základnou požiadavkou pre Eyebrowse bolo flexibilné vyhľadávanie a načítanie správ. Vyžiadal si komponent indexovania a vyhľadávania, ktorý by efektívne aktualizoval databázu indexov, keď prichádzali nové správy, umožňoval viacerým používateľom vyhľadávať a aktualizovať databázu indexov súčasne a škálovať na archívy obsahujúce milióny správ.

Každý ďalší otvorený vyhľadávač, ktorý som hodnotil, vrátane Swish-E, Glimpse, iSearch a libibex, nejakým spôsobom zle vyhovoval požiadavkám Eyebrowse. Takto by bola integrácia problematická a / alebo časovo náročná. S Lucene som pridal indexovanie a hľadanie do Eyebrowse za niečo viac ako pol dňa, od počiatočného stiahnutia po plne funkčný kód! To bola menej ako jedna desatina času vývoja, ktorý som mal v rozpočte, a priniesol užšie integrovaný a na funkcie bohatý výsledok ako ktorýkoľvek iný vyhľadávací nástroj, ktorý som zvažoval.

Ako fungujú vyhľadávače

Vytváranie a udržiavanie obrátený index je ústredným problémom pri budovaní efektívneho vyhľadávača kľúčových slov. Ak chcete indexovať dokument, musíte ho najskôr naskenovať a vytvoriť tak zoznam príspevky. Príspevky popisujú výskyty slova v dokumente; všeobecne zahŕňajú slovo, ID dokumentu a prípadne umiestnenie (-ia) alebo frekvenciu slova v dokumente.

Ak si myslíte, že sú príspevky ako n-tice formulára , sada dokumentov prinesie zoznam zaúčtovaní zoradených podľa ID dokumentu. Ale aby ste mohli efektívne nájsť dokumenty, ktoré obsahujú konkrétne slová, mali by ste namiesto toho triediť príspevky podľa slov (alebo podľa slov aj dokumentov, čo urýchli viacslovné vyhľadávanie). V tomto zmysle je vytvorenie indexu vyhľadávania v zásade problémom s triedením. Vyhľadávací index je zoznam príspevkov zoradených podľa slov.

Inovatívna implementácia

Väčšina vyhľadávacích nástrojov používa na udržiavanie indexu stromy typu B; sú relatívne stabilné vzhľadom na vkladanie a majú dobre chované vstupno-výstupné vlastnosti (vyhľadávania a vkladania sú operácie O (log n)). Lucene uplatňuje trochu odlišný prístup: namiesto udržiavania jediného indexu vytvára viac indexových segmentov a pravidelne ich zlučuje. Pre každý nový indexovaný dokument vytvorí Lucene nový segment indexu, ale rýchlo zlúči malé segmenty s väčšími - celkový počet segmentov tak zostane malý, takže vyhľadávanie zostane rýchle. Aby optimalizoval index na rýchle vyhľadávanie, môže Lucene zlúčiť všetky segmenty do jedného, ​​čo je užitočné pre zriedka aktualizované indexy. Aby sa zabránilo konfliktom (alebo blokovaniu réžie) medzi čítačmi indexov a zapisovateľmi, Lucene nikdy neupravuje segmenty na danom mieste, iba vytvára nové. Pri zlučovaní segmentov napíše Lucene nový segment a vymaže tie staré - po tom, ako ho aktívny čitatelia zatvoria. Tento prístup je dobre škálovateľný, ponúka vývojárovi vysoký stupeň flexibility pri obchodovaní s rýchlosťou indexovania pre rýchlosť vyhľadávania a má požadované vstupno-výstupné charakteristiky pre zlúčenie aj prehľadávanie.

Segment indexu Lucene sa skladá z niekoľkých súborov:

  • Register slovníka obsahujúci jednu položku pre každých 100 položiek v slovníku
  • Slovník obsahujúci jednu položku pre každé jedinečné slovo
  • Súbor príspevkov obsahujúci záznam pre každý príspevok

Pretože Lucene nikdy neaktualizuje segmenty na danom mieste, môžu byť uložené v plochých súboroch namiesto komplikovaných B-stromov. Na rýchle vyhľadanie obsahuje slovník slovník posunov do súboru slovníka a slovník obsahuje posuny do súboru účtovaní. Lucene tiež implementuje rôzne triky na kompresiu slovníka a zverejňovanie súborov - čím znižuje vstupné / výstupné hodnoty disku - bez toho, aby mu vznikli značné náklady na procesor.

Hodnotenie vyhľadávacích nástrojov

Medzi ďalšie široko používané vyhľadávače typu open source patria Swish-E, Glimpse, libibex, freeWAIS a iSearch. Ako každý softvérový balík, aj každý je optimalizovaný pre použitie v konkrétnych situáciách; často je ťažké nasadiť tieto nástroje mimo domén, na ktoré sú určené. Pri hodnotení vyhľadávacieho nástroja zvážte nasledujúce funkcie:

  • Prírastkové verzus dávkové indexovanie: Niektoré vyhľadávače podporujú iba dávkové indexovanie; po vytvorení indexu pre skupinu dokumentov je pridávanie nových dokumentov ťažké bez opätovnej indexácie všetkých dokumentov. Prírastkové indexovanie umožňuje ľahké pridávanie dokumentov k existujúcemu indexu. Pre niektoré aplikácie, napríklad pre tie, ktoré spracúvajú živé dátové kanály, je kritické inkrementálne indexovanie. Lucene podporuje obidva typy indexovania.
  • Zdroje dát: Mnoho vyhľadávacích nástrojov dokáže indexovať iba súbory alebo webové stránky. Toto znevýhodňuje aplikácie, pri ktorých indexované údaje pochádzajú z databázy alebo kde existuje viac virtuálnych dokumentov v jednom súbore, napríklad v archíve ZIP. Lucene umožňuje vývojárom doručiť dokument do indexátora prostredníctvom servera String alebo an InputStream, ktorá umožňuje abstrahovanie zdroja údajov od údajov. S týmto prístupom však musí vývojár dodať príslušné čítačky údajov.
  • Ovládanie indexovania: Niektoré vyhľadávače môžu automaticky prehľadávať adresárový strom alebo webovú stránku, aby našli dokumenty na indexovanie. Aj keď je to pohodlné, ak sú vaše údaje už uložené týmto spôsobom, indexovacie prehľadávače založené na prehľadávači často poskytujú obmedzenú flexibilitu pre aplikácie, ktoré vyžadujú jemnú kontrolu nad indexovanými dokumentmi. Pretože Lucene pracuje primárne v inkrementálnom režime, umožňuje aplikácii vyhľadávať a načítať dokumenty.
  • Formáty súborov: Niektoré vyhľadávače môžu indexovať iba textové alebo HTML dokumenty; iné podporujú filtračný mechanizmus, ktorý ponúka jednoduchú alternatívu k indexovaniu dokumentov textového procesora, dokumentov SGML a ďalších formátov súborov. Lucene podporuje takýto mechanizmus.
  • Označovanie obsahu: Niektoré vyhľadávače považujú dokument za jeden prúd tokenov; iné umožňujú špecifikáciu viacerých údajových polí v dokumente, napríklad „predmet“, „abstrakt“, „autor“ a „telo“. Toto umožňuje sémanticky bohatšie dotazy ako „autor“ obsahuje Hamilton A telo obsahuje Ústava. “Lucene podporuje označovanie obsahu tým, že s dokumentmi zaobchádza ako so zbierkami polí, a podporuje dotazy, ktoré určujú, v ktorých poliach sa majú vyhľadávať.
  • Stop-textové spracovanie: Bežné slová, ako napríklad „a“, „a“ a „the“, pridávajú indexu vyhľadávania malú hodnotu. Ale keďže sú tieto slová také bežné, ich katalogizácia významne prispeje k času indexovania a veľkosti indexu. Väčšina vyhľadávacích nástrojov nebude indexovať určité slová s názvom stop slová. Niektorí používajú zoznam zastavovacích slov, zatiaľ čo iní vyberajú zastavovacie slová štatisticky. Lucene zvláda zastavovacie slová s tým všeobecnejším Analyzátor mechanizmus, ktorý bude opísaný neskôr, a poskytuje StopAnalyzer trieda, ktorá vylučuje stop slová zo vstupného toku.
  • Stonka: Užívateľ si často želá, aby dopyt na jedno slovo zodpovedal iným podobným slovám. Napríklad dopyt „skok“ by sa pravdepodobne mal zhodovať aj so slovami „skok“, „skok“ alebo „skok“. Nazýva sa redukcia slova na jeho koreňovú formu prameniaci. Lucene zatiaľ neimplementuje funkciu stemming, ale stopker by ste mohli ľahko pridať prostredníctvom zložitejšieho nástroja Analyzátor trieda.
  • Funkcie dotazu: Vyhľadávacie nástroje podporujú rôzne funkcie dotazov. Niektoré podporujú úplné booleovské dotazy; iné iba podporujú a dotazy. Niektoré pri každom zásahu vrátia skóre „relevantnosti“. Niektoré dokážu spracovať susedské alebo blízke dotazy - „vyhľadávanie nasledovaný motor “alebo„ Knicks blízko Celtics "- iní môžu vyhľadávať iba podľa jednotlivých kľúčových slov. Niektoré môžu prehľadávať viac indexov naraz a zlúčiť výsledky, aby sa dosiahlo zmysluplné skóre relevancie. Lucene podporuje širokú škálu funkcií dotazu vrátane všetkých tých, ktoré sú uvedené vyššie. Lucene to však umožňuje nepodporuje hodnotný dotaz Soundex alebo „zvuky ako“.
  • Súbežnosť: Môžu viacerí používatelia prehľadávať index súčasne? Môže používateľ prehľadávať index, zatiaľ čo ho iný aktualizuje? Aplikácia Lucene umožňuje používateľom vyhľadávať v indexe transakčne, aj keď index súčasne aktualizuje iný používateľ.
  • Podpora v iných jazykoch ako v angličtine: Mnoho vyhľadávačov implicitne predpokladá, že cieľovým jazykom je angličtina; je to zrejmé v oblastiach, ako sú zoznamy zastavených slov, algoritmy vytvárania báz a použitie vzdialenosti na účely zhody frázových dotazov. Keď Lucene predspracuje vstupný tok cez Analyzátor triedy, ktorú poskytuje vývojár, je možné vykonať filtrovanie podľa jazyka.

Aj keď to v žiadnom prípade nie je vyčerpávajúce, uvedený zoznam ponúka východiskový bod pre hodnotenie vyhľadávacieho nástroja pre konkrétny projekt. Niektoré vyhľadávacie nástroje nie sú vhodné na určité úlohy - pochopenie požiadaviek vašej aplikácie vám môže pomôcť vybrať ten správny nástroj pre danú úlohu.

Pomocou Lucene

Ilustrujem, ako používať program Lucene na vytvorenie, vyplnenie a prehľadanie indexu. Kvôli prehľadnosti boli z ukážkových programov vynechané príkazy na import a spracovanie výnimiek. Na týchto ilustráciách som uložil vyhľadávací index do súborového systému (indexy môžete uložiť kdekoľvek, napr. V pamäti alebo v databáze). Indexované súbory sú jednoduché textové súbory. S programom Lucene môžete tiež ľahko indexovať ďalšie formáty dokumentov a dokumenty, ktoré nie sú uložené v súboroch.

Vytvorte index

Jednoduchý program CreateIndex.java vytvorí prázdny index vygenerovaním IndexWriter objekt a dá mu pokyn, aby vytvoril prázdny index. V tomto príklade je názov adresára, do ktorého sa bude index ukladať, uvedený na príkazovom riadku.

public class CreateIndex {// usage: CreateIndex index-directory public static void main (String [] args) throws Exception {String indexPath = args [0]; Zapisovač IndexWriter; // Index sa vytvorí otvorením IndexWriter s argumentom // create nastaveným na true. spisovateľ = nový IndexWriter (indexPath, null, true); writer.close (); }} 

Register textových dokumentov

IndexFile.java ukazuje, ako pridať dokumenty - súbory pomenované v príkazovom riadku - do indexu. Pre každý súbor Indexové súbory vytvára a Dokument objekt, potom zavolá IndexWriter.addDocument pridať do indexu. Z pohľadu Lucene a Dokument je kolekcia polí, ktoré sú pármi názov-hodnota. A Lúka môže získať svoju hodnotu z a String, pre krátke polia alebo InputStream, pre dlhé polia. Používanie polí vám umožňuje rozdeliť dokument na osobitne prehľadateľné a indexovateľné časti a priradiť k dokumentu metadáta - napríklad meno, autor alebo dátum úpravy. Napríklad pri ukladaní poštových správ môžete vložiť predmet správy, autora, dátum a telo správy do samostatných polí a potom vytvoriť sémanticky bohatšie dotazy ako „predmet“. obsahuje Java A autor obsahuje Gosling. “V nižšie uvedenom kóde ukladáme do každého dve polia Dokument: cesta, aby ste identifikovali pôvodnú cestu k súboru, aby ju bolo možné neskôr vyhľadať, a - telo, za obsah súboru.

verejná trieda IndexFiles {// použitie: súbor indexovej cesty IndexFiles. . . public static void main (String [] args) vyvolá Výnimku {String indexPath = args [0]; Zapisovač IndexWriter; Writer = new IndexWriter (indexPath, new SimpleAnalyzer (), false); pre (int i = 1; i
$config[zx-auto] not found$config[zx-overlay] not found