Programování

Vyhledávač Lucene: Výkonný, flexibilní a bezplatný

Nenechte se oklamat nízkým číslem verze - 0,04 k srpnu 2000. Vyhledávací modul Lucene je robustní, výkonná a flexibilní sada nástrojů pro vyhledávání, která je připravena řešit mnoho běžných problémů s vyhledáváním. A protože je nyní k dispozici pod flexibilnější licencí LGPL open source, cena (zdarma!) Je také správná.

Doug Cutting, zkušený vývojář nástrojů pro vyhledávání a vyhledávání textu, vytvořil Lucene. Cutting je hlavním autorem vyhledávače V-Twin (součást úsilí operačního systému Copland společnosti Apple) a v současné době je senior architektem společnosti Excite. Navrhl Lucene, aby usnadnil přidání možnosti indexování a vyhledávání do široké škály aplikací, včetně:

  • Prohledávatelný e-mail: E-mailová aplikace by mohla umožnit uživatelům prohledávat archivované zprávy a přidávat nové zprávy do indexu hned, jak přijdou.
  • Online vyhledávání dokumentace: Čtečka dokumentace - na CD, na webu nebo vložená do aplikace - může uživatelům umožnit prohledávat online dokumentaci nebo archivované publikace.
  • Prohledávatelné webové stránky: Webový prohlížeč nebo server proxy by mohl vytvořit osobní vyhledávač, který by indexoval každou webovou stránku, kterou uživatel navštívil, a umožňoval tak uživatelům snadno znovu navštívit stránky.
  • Vyhledávání na webu: Program CGI může uživatelům umožnit prohledávat váš web.
  • Hledání obsahu: Aplikace by mohla umožnit uživateli prohledat uložený dokument pro konkrétní obsah; toto by mohlo být integrováno do dialogu Otevřít dokument.
  • Řízení verzí a správa obsahu: Systém správy dokumentů může indexovat dokumenty nebo verze dokumentů, takže je lze snadno načíst.
  • Novinky a informační kanály: Zpravodajský server nebo server mohly články indexovat hned, jak dorazí.

Většinu těchto funkcí by samozřejmě mohlo provádět mnoho vyhledávačů, ale jen málo otevřených vyhledávacích nástrojů nabízí snadné použití, rychlou implementaci a flexibilitu Lucene.

Poprvé jsem použil Lucene při vývoji Eyebrowse, open source nástroje založeného na prostředí Java pro katalogizaci a procházení e-mailových seznamů. (Odkaz najdete v Zdrojích.) Základním požadavkem pro Eyebrowse bylo flexibilní vyhledávání a načítání zpráv. Vyžadovala komponentu indexování a vyhledávání, která by efektivně aktualizovala základnu indexu při příchodu nových zpráv, umožňovala více uživatelům souběžně prohledávat a aktualizovat základnu indexu a škálovat na archivy obsahující miliony zpráv.

Každý další otevřený vyhledávač, který jsem vyhodnotil, včetně Swish-E, Glimpse, iSearch a libibex, byl nějakým způsobem špatně přizpůsoben požadavkům Eyebrowse. To by způsobilo integraci problematickou a / nebo časově náročnou. S Lucene jsem přidal indexování a vyhledávání do Eyebrowse za něco málo přes půl dne, od počátečního stažení až po plně funkční kód! To byla méně než jedna desetina vývojového času, který jsem měl v rozpočtu, a přinesl těsněji integrovaný a na funkce bohatý výsledek než jakýkoli jiný vyhledávací nástroj, který jsem zvažoval.

Jak fungují vyhledávače

Vytváření a údržba obrácený index je ústředním problémem při budování efektivního vyhledávače klíčových slov. Chcete-li indexovat dokument, musíte jej nejprve naskenovat a vytvořit seznam příspěvky. Příspěvky popisují výskyty slova v dokumentu; obecně obsahují slovo, ID dokumentu a případně umístění (místa) nebo frekvenci slova v dokumentu.

Pokud si myslíte, že příspěvky jsou n-tice formuláře , sada dokumentů přinese seznam účtů seřazených podle ID dokumentu. Ale abyste mohli efektivně najít dokumenty, které obsahují konkrétní slova, měli byste místo toho třídit příspěvky podle slov (nebo podle slov a dokumentů, což zrychlí vyhledávání více slov). V tomto smyslu je vytváření indexu vyhledávání v zásadě problém s tříděním. Index vyhledávání je seznam příspěvků seřazených podle slov.

Inovativní implementace

Většina vyhledávačů používá B-stromy k udržení indexu; jsou relativně stabilní vzhledem k vkládání a mají dobře chované I / O charakteristiky (vyhledávání a vkládání jsou operace O (log n)). Lucene zaujímá poněkud odlišný přístup: místo udržování jediného indexu vytváří více indexových segmentů a pravidelně je slučuje. Pro každý nový indexovaný dokument vytvoří Lucene nový segment indexu, ale rychle spojí malé segmenty s většími - celkový počet segmentů tak zůstane malý, takže vyhledávání zůstane rychlé. Chcete-li optimalizovat index pro rychlé vyhledávání, může Lucene sloučit všechny segmenty do jednoho, což je užitečné pro zřídka aktualizované indexy. Aby se zabránilo konfliktům (nebo zamykání režijních nákladů) mezi čtečkami indexů a zapisovači, Lucene nikdy neupravuje segmenty na místě, vytváří pouze nové. Při slučování segmentů zapíše Lucene nový segment a odstraní staré - poté, co jej aktivní čtenáři uzavřou. Tento přístup je dobře škálovatelný, nabízí vývojáři vysoký stupeň flexibility při obchodování s rychlostí indexování pro rychlost vyhledávání a má žádané I / O charakteristiky jak pro slučování, tak pro vyhledávání.

Lucene indexový segment se skládá z několika souborů:

  • Index slovníku obsahující jednu položku pro každých 100 položek ve slovníku
  • Slovník obsahující jednu položku pro každé jedinečné slovo
  • Soubor příspěvků obsahující záznam pro každý příspěvek

Protože Lucene nikdy neaktualizuje segmenty na místě, mohou být uloženy v plochých souborech místo komplikovaných B-stromů. Pro rychlé načtení obsahuje slovník slovník posuny do souboru slovníku a slovník obsahuje posuny do souboru účtování. Lucene také implementuje řadu triků ke kompresi slovníku a odesílání souborů - čímž snižuje vstupně-výstupní operace na disku - aniž by vznikly značné režijní náklady CPU.

Hodnocení vyhledávačů

Mezi další široce používané vyhledávače typu open source patří Swish-E, Glimpse, libibex, freeWAIS a iSearch. Jako každý softwarový balíček je každý optimalizován pro použití v konkrétních situacích; často je obtížné nasadit tyto nástroje mimo jejich zamýšlené domény. Při hodnocení vyhledávače zvažte následující funkce:

  • Inkrementální versus dávkové indexování: Některé vyhledávače podporují pouze dávkové indexování; jakmile vytvoří index pro sadu dokumentů, přidávání nových dokumentů bude obtížné, aniž by bylo nutné znovu indexovat všechny dokumenty. Inkrementální indexování umožňuje snadné přidávání dokumentů do existujícího indexu. U některých aplikací, jako jsou ty, které zpracovávají živé datové kanály, je rozhodující přírůstkové indexování. Lucene podporuje oba typy indexování.
  • Zdroje dat: Mnoho vyhledávačů může indexovat pouze soubory nebo webové stránky. Toto znevýhodňuje aplikace, kde indexovaná data pocházejí z databáze nebo kde existuje více virtuálních dokumentů v jednom souboru, jako je archiv ZIP. Lucene umožňuje vývojářům doručit dokument do indexeru prostřednictvím Tětiva nebo InputStream, což umožňuje abstrakci zdroje dat z dat. S tímto přístupem však musí vývojář poskytnout příslušná čtečka dat.
  • Ovládání indexování: Některé vyhledávače mohou automaticky procházet strom adresářů nebo web a vyhledávat dokumenty k indexování. I když je to pohodlné, pokud jsou vaše data již uložena tímto způsobem, indexovací moduly založené na prolézacím modulu často poskytují omezenou flexibilitu pro aplikace, které vyžadují jemnou kontrolu nad indexovanými dokumenty. Protože Lucene pracuje primárně v přírůstkovém režimu, umožňuje aplikaci vyhledávat a načítat dokumenty.
  • Formáty souborů: Některé vyhledávače mohou indexovat pouze textové nebo HTML dokumenty; jiné podporují filtrační mechanismus, který nabízí jednoduchou alternativu k indexování dokumentů pro zpracování textu, dokumentů SGML a dalších formátů souborů. Lucene takový mechanismus podporuje.
  • Označování obsahu: Některé vyhledávače považují dokument za jeden proud tokenů; jiné umožňují specifikaci více datových polí v dokumentu, například „předmět“, „abstrakt“, „autor“ a „tělo“. To umožňuje sémanticky bohatší dotazy jako „autor“ obsahuje Hamilton A tělo obsahuje Ústava. “Lucene podporuje označování obsahu tím, že s dokumenty zachází jako s kolekcemi polí, a podporuje dotazy, které určují, ve kterých polích se má hledat.
  • Stop-textové zpracování: Běžná slova, například „a“, „a“ a „the“, přidávají indexu vyhledávání malou hodnotu. Ale protože jsou tato slova tak běžná, jejich katalogizace významně přispěje k době indexování a velikosti indexu. Většina vyhledávačů nebude indexovat určitá slova, tzv přestaň slova. Někteří používají seznam zastavovacích slov, zatímco jiní vybírají zastavovací slova statisticky. Lucene zvládá zastavovací slova obecněji Analyzátor mechanismus, který bude popsán později, a poskytuje StopAnalyzer třída, která vylučuje stop slova ze vstupního proudu.
  • Stemming: Uživatel často touží po dotazu na jedno slovo, aby odpovídalo jiným podobným slovům. Například dotaz „skok“ by měl pravděpodobně také odpovídat slovům „skákat“, „skákat“ nebo „skákat“. Volá se redukce slova na jeho kořenovou formu pramenící. Lucene zatím neimplementuje stemming, ale můžete snadno přidat stemmer přes sofistikovanější Analyzátor třída.
  • Funkce dotazu: Vyhledávače podporují různé funkce dotazů. Některé podporují úplné booleovské dotazy; ostatní pouze podporují a dotazy. Někteří při každém zásahu vrací skóre „relevance“. Některé dokážou zpracovat dotazy na sousedství nebo blízkost - "vyhledávání následován motor "nebo" Knicks u Celtics "- ostatní mohou vyhledávat pouze na jednotlivých klíčových slovech. Někteří mohou prohledávat více indexů najednou a sloučit výsledky, aby získali smysluplné skóre relevance. Lucene podporuje širokou škálu funkcí dotazu, včetně všech výše uvedených. Lucene však ano nepodporuje cenný dotaz Soundex nebo „zní to jako“.
  • Konkurence: Může více uživatelů prohledávat index současně? Může uživatel vyhledávat v indexu, zatímco jiný jej aktualizuje? Lucene umožňuje uživatelům vyhledávat index transakčně, i když index současně aktualizuje jiný uživatel.
  • Neanglická podpora: Mnoho vyhledávačů implicitně předpokládá, že angličtina je cílovým jazykem; to je evidentní v oblastech, jako jsou seznamy stop-slov, vyřazovací algoritmy a použití blízkosti k porovnávání frázových dotazů. Jak Lucene předzpracovává vstupní proud přes Analyzátor třídy poskytované vývojářem, je možné provádět filtrování specifické pro jazyk.

Ačkoli v žádném případě není vyčerpávající, výše uvedený seznam nabízí výchozí bod pro hodnocení vyhledávače pro konkrétní projekt. Některé vyhledávací nástroje jsou pro určité úkoly nevhodné - porozumění požadavkům vaší aplikace vám může pomoci vybrat ten správný nástroj pro danou úlohu.

Používání Lucene

Ilustruji, jak pomocí Lucene vytvořit, naplnit a prohledat index. Pro přehlednost byly z ukázkových programů vynechány příkazy k importu a zpracování výjimek. Na těchto ilustracích jsem uložil vyhledávací index do souborového systému (indexy můžete ukládat kdekoli, např. V paměti nebo v databázi). Indexované soubory jsou jednoduché textové soubory. S Lucene můžete také snadno indexovat další formáty dokumentů a dokumenty, které nejsou uloženy v souborech.

Vytvořte index

Jednoduchý program CreateIndex.java vytvoří prázdný index vygenerováním IndexWriter objekt a instruuje jej, aby vytvořil prázdný index. V tomto příkladu je název adresáře, který bude ukládat index, zadán na příkazovém řádku.

public class CreateIndex {// usage: CreateIndex index-directory public static void main (String [] args) throws Exception {String indexPath = args [0]; Zapisovač IndexWriter; // Index se vytvoří otevřením IndexWriter s argumentem // create nastaveným na true. Writer = new IndexWriter (indexPath, null, true); writer.close (); }} 

Rejstřík textových dokumentů

IndexFile.java ukazuje, jak přidat dokumenty - soubory pojmenované na příkazovém řádku - do rejstříku. Pro každý soubor Indexové soubory vytváří Dokument objekt, pak zavolá IndexWriter.addDocument přidat do indexu. Z pohledu Lucene, a Dokument je kolekce polí, která jsou páry název-hodnota. A Pole může získat jeho hodnotu z a Tětiva, pro krátká pole nebo InputStream, pro dlouhá pole. Použití polí vám umožňuje rozdělit dokument do odděleně prohledávatelných a indexovatelných sekcí a přidružit metadata - například jméno, autora nebo datum úpravy - k dokumentu. Například při ukládání e-mailových zpráv můžete do samostatných polí vložit předmět, autora, datum a tělo zprávy a potom vytvořit sémanticky bohatší dotazy, například „předmět obsahuje Jáva A autor obsahuje Gosling. “V níže uvedeném kódu ukládáme do každého dvě pole Dokument: cesta, k identifikaci původní cesty k souboru, aby ji bylo možné později načíst, a tělo, pro obsah souboru.

veřejná třída IndexFiles {// použití: soubor indexové cesty IndexFiles. . . public static void main (String [] args) vyvolá výjimku {String indexPath = args [0]; Zapisovač IndexWriter; Writer = new IndexWriter (indexPath, new SimpleAnalyzer (), false); pro (int i = 1; i
$config[zx-auto] not found$config[zx-overlay] not found