Programavimas

„Lucene“ paieškos variklis: galingas, lankstus ir nemokamas

Neleisk, kad žemas versijos numeris - 0,04 nuo 2000 m. Rugpjūčio - apgaudinėtų tave. „Lucene“ paieškos variklis yra tvirtas, galingas ir lankstus paieškos įrankių rinkinys, paruoštas spręsti daugelį įprastų paieškos problemų. Kadangi dabar jį galima įsigyti pagal lankstesnę LGPL atvirojo kodo licenciją, kaina (nemokama!) Taip pat yra tinkama.

Dougas Cuttingas, patyręs teksto paieškos ir paieškos įrankių kūrėjas, sukūrė „Lucene“. „Cutting“ yra pagrindinis „V-Twin“ paieškos variklio („Apple Copland“ operacinės sistemos pastangų dalis) autorius ir šiuo metu yra „Excite“ vyresnysis architektas. Jis sukūrė „Lucene“, kad būtų lengva pridėti indeksavimo ir paieškos galimybes įvairiose programose, įskaitant:

  • Ieškomas el. Paštas: El. Pašto programa gali leisti vartotojams ieškoti archyvuotų pranešimų ir pridėti naujus pranešimus prie indekso jiems atvykus.
  • Internetinė dokumentų paieška: Dokumentų skaitytuvas - kompaktinis diskas, žiniatinklis ar įdėtas į programą - gali leisti vartotojams ieškoti internetinių dokumentų ar archyvuotų leidinių.
  • Tinklalapiai, kuriuose galima ieškoti: Žiniatinklio naršyklė arba tarpinis serveris galėtų sukurti asmeninį paieškos variklį, kad būtų galima indeksuoti kiekvieną vartotojo aplankytą tinklalapį, kad vartotojai galėtų lengvai peržiūrėti puslapius.
  • Svetainės paieška: CGI programa gali leisti vartotojams ieškoti jūsų svetainėje.
  • Turinio paieška: Taikomoji programa gali leisti vartotojui ieškoti išsaugoto dokumento pagal konkretų turinį; tai galima integruoti į „Open Document“ dialogą.
  • Versijų valdymas ir turinio valdymas: Dokumentų valdymo sistema gali indeksuoti dokumentus ar dokumentų versijas, todėl juos galima lengvai gauti.
  • Naujienos ir laidų teikimo kanalai: Naujienų serveris ar pranešimų agentūra gali indeksuoti straipsnius jiems atvykus.

Žinoma, daugelis paieškos sistemų galėtų atlikti daugumą šių funkcijų, tačiau nedaugelis atvirojo kodo paieškos įrankių siūlo „Lucene“ patogumą naudoti, greitą diegimą ir lankstumą.

Pirmą kartą „Lucene“ panaudojau kurdamas „Eyebrowse“ - atvirojo kodo „Java“ pagrįstą įrankį adresų sąrašų katalogavimui ir naršymui. (Žr. Šaltinius, kad sužinotumėte nuorodą.) Pagrindinis antakių reikalavimas buvo lanksti pranešimų paieška ir paieškos galimybė. Reikalavo indeksavimo ir paieškos komponento, kuris efektyviai atnaujintų indeksų bazę, kai atsiras naujų pranešimų, leis keliems vartotojams tuo pačiu metu ieškoti ir atnaujinti indeksų bazę ir išplėsti iki archyvų, kuriuose yra milijonai pranešimų.

Kiekvienas kitas mano vertintas atvirojo kodo paieškos variklis, įskaitant „Swish-E“, „Glimpse“, „iSearch“ ir „libibex“, kažkaip prastai atitiko antakių reikalavimus. Dėl to integracija būtų tapusi problemiška ir (arba) užimanti daug laiko. Su „Lucene“ pridėjau indeksavimą ir paiešką antakiams per šiek tiek daugiau nei pusę dienos, nuo pradinio atsisiuntimo iki visiškai veikiančio kodo! Tai buvo mažiau nei dešimtadalis kūrimo laiko, kurį buvau numatęs biudžete, ir davė griežčiau integruotą ir funkcijomis turtingesnį rezultatą nei bet kuris kitas mano svarstomas paieškos įrankis.

Kaip veikia paieškos sistemos

Sukurti ir prižiūrėti apverstas indeksas yra pagrindinė problema kuriant efektyvų raktinių žodžių paieškos variklį. Norėdami indeksuoti dokumentą, pirmiausia turite jį nuskaityti ir sudaryti jų sąrašą komandiruotės. Skelbimai apibūdina dokumento žodžio atvejus; jie paprastai apima žodį, dokumento ID ir galbūt vietą (-as) ar žodžio dažnumą dokumente.

Jei manote, kad komandiruotės yra formos paketai , iš dokumentų rinkinio bus pateiktas komandiruočių sąrašas, surūšiuotas pagal dokumento ID. Tačiau norint efektyviai rasti dokumentus, kuriuose yra konkrečių žodžių, turėtumėte surūšiuoti skelbimus pagal žodį (arba pagal žodį, ir pagal dokumentą, todėl greičiau bus ieškoma daug žodžių). Šia prasme paieškos indekso sudarymas iš esmės yra rūšiavimo problema. Paieškos rodyklė yra skelbimų sąrašas, surūšiuotas pagal žodį.

Novatoriškas įgyvendinimas

Dauguma paieškos sistemų naudoja B medžius, kad išlaikytų indeksą; jie yra palyginti stabilūs įterpimo atžvilgiu ir turi gerai elgiamas įvesties / išvesties charakteristikas (paieškos ir įterpimai yra O (log n) operacijos). „Lucene“ laikosi šiek tiek kitokio požiūrio: užuot išlaikęs vieną indeksą, jis sukuria kelis indekso segmentus ir periodiškai juos sujungia. Kiekvienam naujam indeksuojamam dokumentui „Lucene“ sukuria naują indekso segmentą, tačiau jis greitai sujungia mažus segmentus su didesniais - taip bendras segmentų skaičius lieka nedidelis, todėl paieškos išlieka greitos. Norėdami optimizuoti indeksą greitai paieškai, „Lucene“ gali sujungti visus segmentus į vieną, o tai naudinga retai atnaujinamiems indeksams. Siekdama užkirsti kelią konfliktams (arba užfiksuoti pridėtines išlaidas) tarp rodyklių skaitytojų ir rašytojų, „Lucene“ niekada nekeičia segmentų vietoje, o sukuria tik naujus. Sujungiant segmentus, „Lucene“ rašo naują segmentą ir ištrina senus - po to, kai aktyvūs skaitytojai jį uždaro. Šis metodas puikiai tinka, siūlo kūrėjui didelį lankstumą parduodant indeksavimo greitį paieškos greičiui ir turi pageidaujamas įvesties / išvesties charakteristikas tiek sujungiant, tiek ieškant.

„Lucene“ indekso segmentą sudaro keli failai:

  • Žodyno rodyklė, kurioje yra vienas įrašas kiekvienam 100 žodyno įrašų
  • Žodynas, kuriame yra vienas įrašas kiekvienam unikaliam žodžiui
  • Siuntimų byla, kurioje yra įrašas kiekvienam komandiravimui

Kadangi „Lucene“ niekada neatnaujina segmentų vietoje, juos galima laikyti plokščiuose failuose, o ne sudėtinguose B medžiuose. Greitai gavus, žodyno rodyklėje yra žodyno failo poslinkiai, o žodyne - įrašų failo poslinkiai. „Lucene“ taip pat įgyvendina įvairius triukus, kad suglaudintų žodyną ir paskelbtų failus - taip sumažindama disko įvestį ir išvestį - nepatirdama didelių procesoriaus išlaidų.

Paieškos sistemų įvertinimas

Kitos plačiai naudojamos atvirojo kodo paieškos sistemos yra „Swish-E“, „Glimpse“, „libibex“, „freeWAIS“ ir „iSearch“. Kaip ir bet kuris programinės įrangos paketas, kiekvienas iš jų yra optimizuotas naudoti tam tikrose situacijose; dažnai sunku įdiegti šias priemones už numatytų sričių ribų. Vertindami paieškos variklį, atsižvelkite į šias funkcijas:

  • Papildomas ir paketinis indeksavimas: Kai kurios paieškos sistemos palaiko tik paketinį indeksavimą; Sukūrus dokumentų rinkinio rodyklę, pridėti naujų dokumentų tampa sunku be reeksekso visų dokumentų. Palaipsnis indeksavimas leidžia lengvai pridėti dokumentus prie esamo indekso. Kai kurioms programoms, pvz., Tvarkančioms tiesioginius duomenų srautus, laipsniškas indeksavimas yra labai svarbus. „Lucene“ palaiko abu indeksavimo tipus.
  • Duomenų šaltinis: Daugelis paieškos sistemų gali indeksuoti tik failus ar tinklalapius. Tai trukdo programoms, kuriose indeksuoti duomenys gaunami iš duomenų bazės arba kai viename faile yra keli virtualūs dokumentai, pvz., ZIP archyvas. „Lucene“ leidžia kūrėjams pateikti dokumentą indeksuotojui per a Stygos arba an „InputStream“, leidžiantį iš duomenų išskirti duomenų šaltinį. Tačiau taikydamas šį metodą kūrėjas turi pateikti tinkamus skaitytojus duomenims.
  • Indeksavimo valdymas: Kai kurios paieškos sistemos gali automatiškai nuskaityti katalogų medį ar svetainę, kad rastų indeksuojamus dokumentus. Nors tai yra patogu, jei jūsų duomenys jau saugomi tokiu būdu, tikrinimo programos indeksavimo priemonės dažnai suteikia ribotą lankstumą toms programoms, kurioms reikia išsamios indeksuotų dokumentų kontrolės. Kadangi „Lucene“ veikia pirmiausia laipsniškai, ji leidžia programai rasti ir nuskaityti dokumentus.
  • Failų formatai: Kai kurios paieškos sistemos gali indeksuoti tik teksto ar HTML dokumentus; kiti palaiko filtravimo mechanizmą, kuris siūlo paprastą teksto apdorojimo dokumentų, SGML dokumentų ir kitų failų formatų indeksavimo alternatyvą. Lucene palaiko tokį mechanizmą.
  • Turinio žymėjimas: Kai kurios paieškos sistemos dokumentą traktuoja kaip vieną žetonų srautą; kiti leidžia dokumente nurodyti kelis duomenų laukus, tokius kaip „tema“, „abstraktus“, „autorius“ ir „turinys“. Tai leidžia semantiškai turtingesnes užklausas, tokias kaip „autorius“ yra Hamiltonas IR kūnas yra Konstitucija. "„ Lucene "palaiko turinio žymėjimą laikydama dokumentus kaip laukų rinkinius ir palaiko užklausas, kuriose nurodoma, kuriame lauke (-uose) ieškoti.
  • Stop-word apdorojimas: Dažni žodžiai, pvz., „A“, „ir“ ir „the“, teikia mažai reikšmės paieškos indeksui. Kadangi šie žodžiai yra tokie įprasti, jų katalogavimas žymiai prisidės prie indeksavimo laiko ir indekso dydžio. Dauguma paieškos sistemų neindeksuos tam tikrų žodžių, vadinamų sustabdyti žodžius. Vieni naudoja stabdymo žodžių sąrašą, kiti - statistiškai. Liucenė sustabdo žodžius su bendresniais žodžiais Analizatorius mechanizmas, kuris bus aprašytas vėliau, ir pateikia „StopAnalyzer“ klasė, kuri pašalina sustabdymo žodžius iš įvesties srauto.
  • Šaknys: Dažnai vartotojas nori, kad vieno žodžio užklausa atitiktų kitus panašius žodžius. Pavyzdžiui, užklausa „šuolis“ tikriausiai taip pat turėtų atitikti žodžius „šokinėjo“, „šokinėtojas“ ar „šuoliai“. Vadinamas žodžio redukavimas iki šaknies formos kamieno. „Lucene“ dar neįgyvendina „stemming“, bet jūs galite lengvai pridėti stiebą per sudėtingesnį Analizatorius klasė.
  • Užklausos funkcijos: Paieškos sistemos palaiko įvairias užklausų funkcijas. Kai kurie palaiko visas Būlio užklausas; kiti palaiko tik ir užklausos. Kai kurie pateikia „atitikimo“ balą su kiekvienu įvykiu. Kai kurie gali tvarkyti gretimumo ar artumo užklausas - "paiešką" paskui variklis “arba„ Knicks “ netoli „Celtics“ - kiti gali ieškoti tik pagal atskirus raktinius žodžius. Kai kurie gali ieškoti vienu metu keliuose indeksuose ir sujungti rezultatus, kad gautų reikšmingą atitikimo balą. „Lucene“ palaiko platų užklausos funkcijų spektrą, įskaitant visas anksčiau išvardytas. Tačiau „Lucene“ nepalaiko vertingos „Soundex“ arba „skamba“ užklausos.
  • Kartu: Ar keli vartotojai gali ieškoti indekso vienu metu? Ar vartotojas gali ieškoti indekso, kol kitas jį atnaujina? „Lucene“ leidžia vartotojams atlikti sandorį paieškoje, net jei tuo pačiu metu indeksą atnaujina kitas vartotojas.
  • Palaikymas ne anglų kalba: Daugelis paieškos sistemų netiesiogiai daro prielaidą, kad anglų kalba yra tikslinė kalba; tai akivaizdu tokiose srityse kaip „stop-word“ sąrašai, išvestiniai algoritmai ir artumo naudojimas siekiant atitikti frazių užklausas. Kai Lucene iš anksto apdoroja įvesties srautą per Analizatorius klasės, kurią teikia kūrėjas, galima atlikti kalbos specifinį filtravimą.

Nors anaiptol nėra išsamus, aukščiau pateiktame sąraše pateikiamas pradinis taškas vertinant konkretaus projekto paieškos programą. Kai kurie paieškos įrankiai yra prastai pritaikyti tam tikroms užduotims - suprasdami savo programos reikalavimus, galite lengviau pasirinkti tinkamą įrankį.

Naudodamasis „Lucene“

Aš iliustruosiu, kaip naudoti „Lucene“ kuriant, pildant ir ieškant indekso. Aiškumo dėlei importo ataskaitos ir išimčių tvarkymas nebuvo įtrauktas į pavyzdines programas. Šiose iliustracijose aš išsaugojau paieškos indeksą failų sistemoje (indeksus galite saugoti bet kur, pvz., Atmintyje ar duomenų bazėje). Indeksuojami failai yra paprasti tekstiniai failai. Naudodami „Lucene“ taip pat galite lengvai indeksuoti kitus dokumentų formatus ir dokumentus, kurie nėra saugomi failuose.

Sukurkite rodyklę

Paprasta programa CreateIndex.java sukuria tuščią indeksą generuodamas „IndexWriter“ objektas ir nurodymas sukurti tuščią rodyklę. Šiame pavyzdyje katalogo, kuriame bus saugomas indeksas, pavadinimas nurodomas komandinėje eilutėje.

public class CreateIndex {// use: CreateIndex index-directory public static void main (String [] args) meta išimtį {String indexPath = args [0]; „IndexWriter“ rašytojas; // Indeksas sukuriamas atidarius „IndexWriter“ su argumentu // create nustatyta kaip „true“. rašytojas = naujas „IndexWriter“ (indexPath, null, true); rašytojas.uždaryti (); }} 

Rodyklės teksto dokumentai

IndexFile.java parodo, kaip pridėti dokumentus - failus, pavadintus komandinėje eilutėje - prie indekso. Kiekvienam failui IndexFiles sukuria a Dokumentas objektas, tada skambina „IndexWriter.addDocument“ įtraukti jį į rodyklę. Lucene požiūriu, a Dokumentas yra laukų, kurie yra vardo ir vertės poros, rinkinys. A Laukas gali gauti savo vertę iš a Stygos, trumpiems laukams, arba an „InputStream“, ilgiems laukams. Naudodami laukus galite suskaidyti dokumentą į atskiras paieškos ir indeksavimo dalis ir susieti metaduomenis, pvz., Vardą, autorių ar modifikavimo datą, su dokumentu. Pvz., Saugodami el. Laiškus, galite atskiruose laukuose įrašyti pranešimo temą, autorių, datą ir turinį, tada kurti semantiškai turtingesnes užklausas, pvz., „Tema“ yra „Java“ IR autorius yra Gosling. "Žemiau esančiame kode kiekviename saugome po du laukus Dokumentas: kelias, norėdami nustatyti originalų failo kelią, kad jį būtų galima gauti vėliau, ir kūnas, failo turiniui.

viešosios klasės „IndexFiles“ {// naudojimas: „IndexFiles“ indekso kelio failas. . . public static void main (String [] args) meta išimtį {String indexPath = args [0]; „IndexWriter“ rašytojas; rašytojas = new IndexWriter (indexPath, new SimpleAnalyzer (), false); už (int i = 1; i
$config[zx-auto] not found$config[zx-overlay] not found