Programmēšana

Lucene meklētājprogramma: jaudīga, elastīga un bezmaksas

Neļaujiet sevi apmānīt zemajam versijas numuram - 0,04 no 2000. gada augusta. Lucene meklētājprogramma ir spēcīgs, jaudīgs un elastīgs meklēšanas rīku komplekts, kas ir gatavs risināt daudzas izplatītas meklēšanas problēmas. Tā kā tā tagad ir pieejama ar elastīgāku LGPL atvērtā pirmkoda licenci, arī cena (bez maksas!) Ir pareiza.

Doug Cutting, pieredzējis teksta meklēšanas un izguves rīku izstrādātājs, izveidoja Lucene. Griešana ir galvenais meklētājprogrammas V-Twin autors (daļa no Apple Copland operētājsistēmas centieniem) un šobrīd ir Excite vecākais arhitekts. Viņš izstrādāja Lucene, lai būtu ērti indeksēšanas un meklēšanas iespējas pievienot visdažādākajām lietojumprogrammām, tostarp:

  • Pārskatāms e-pasts: E-pasta programma varētu ļaut lietotājiem meklēt arhivētos ziņojumus un pievienot jaunus ziņojumus indeksam, kad tie nonāk.
  • Tiešsaistes dokumentācijas meklēšana: Dokumentācijas lasītājs - CD, Web vai lietojumprogrammā iebūvēts - varētu ļaut lietotājiem meklēt tiešsaistes dokumentāciju vai arhivētas publikācijas.
  • Pārmeklējamas tīmekļa vietnes: Tīmekļa pārlūks vai starpniekserveris varētu izveidot personisku meklētājprogrammu, lai indeksētu katru lietotāja apmeklēto vietni, ļaujot lietotājiem viegli atkārtoti apmeklēt lapas.
  • Vietnes meklēšana: CGI programma varētu ļaut lietotājiem meklēt jūsu vietnē.
  • Satura meklēšana: Lietojumprogramma varētu ļaut lietotājam meklēt saglabātajos dokumentos noteiktu saturu; to varētu integrēt dialoglodziņā Atvērt dokumentu.
  • Versiju kontrole un satura pārvaldība: Dokumentu pārvaldības sistēma varētu indeksēt dokumentus vai dokumentu versijas, lai tos varētu viegli izgūt.
  • Ziņu un elektronisko pakalpojumu plūsmas: Ziņu serveris vai relejs varētu indeksēt rakstus, kad tie nonāk.

Protams, daudzas meklētājprogrammas varētu veikt lielāko daļu šo funkciju, taču daži atvērtā koda meklēšanas rīki piedāvā Lucene ērtu lietošanu, ātru ieviešanu un elastību.

Es pirmo reizi izmantoju Lucene, izstrādājot uzacu Java, kura pamatā ir Java balstīts rīks adresātu sarakstu katalogēšanai un pārlūkošanai. (Skatīt saiti Resursi.) Uzacu pamatprasība bija elastīga ziņojumu meklēšana un izguves spēja. Tā pieprasīja indeksēšanas un meklēšanas komponentu, kas efektīvi atjauninātu indeksa bāzi, kad ienāca jauni ziņojumi, ļaus vairākiem lietotājiem vienlaikus meklēt un atjaunināt indeksa bāzi, kā arī mērogot arhīvos, kas satur miljoniem ziņojumu.

Katra cita atvērtā koda meklētājprogramma, kuru es novērtēju, ieskaitot Swish-E, Glimpse, iSearch un libibex, kaut kādā veidā bija slikti piemērota Uzacu prasībām. Tas būtu padarījis integrāciju problemātisku un / vai laikietilpīgu. Izmantojot Lucene, es pievienoju indeksēšanu un meklēšanu uzacīm nedaudz vairāk nekā pus dienas laikā, sākot no sākotnējās lejupielādes līdz pilnībā darbojošam kodam! Šī bija mazāk nekā viena desmitā daļa no izstrādes laika, ko biju paredzējis budžetam, un tas deva stingrāk integrētu un funkcijām bagātāku rezultātu nekā jebkurš cits manis apsvērtais meklēšanas rīks.

Kā darbojas meklētājprogrammas

Veidojot un uzturot apgriezts indekss ir galvenā problēma, veidojot efektīvu atslēgvārdu meklētājprogrammu. Lai indeksētu dokumentu, vispirms tas ir jāskenē, lai izveidotu to sarakstu norīkošana. Ievietošana apraksta dokumenta vārda gadījumus; tie parasti ietver vārdu, dokumenta ID un, iespējams, vārda atrašanās vietu (vietas) vai biežumu dokumentā.

Ja jūs domājat par norīkojumiem kā veidlapas vienumiem , dokumentu kopa sniegs sūtījumu sarakstu, kas sakārtots pēc dokumenta ID. Bet, lai efektīvi atrastu dokumentus, kas satur konkrētus vārdus, tā vietā sūtījumi jāsakārto pēc vārda (vai gan pēc vārda, gan dokumenta, kas ļaus vairāku vārdu meklēšanu ātrāk). Šajā ziņā meklēšanas indeksa izveide būtībā ir šķirošanas problēma. Meklēšanas indekss ir sūtījumu saraksts, kas sakārtoti pēc vārdiem.

Novatoriska ieviešana

Lielākā daļa meklētājprogrammu indeksa uzturēšanai izmanto B kokus; tie ir salīdzinoši stabili attiecībā pret ievietošanu un tiem ir labi izturētas I / O īpašības (uzmeklēšana un ievietošana ir O (log n) darbības). Lucene izmanto nedaudz atšķirīgu pieeju: tā vietā, lai uzturētu vienu indeksu, tā veido vairākus indeksa segmentus un periodiski tos apvieno. Katram jaunajam indeksētajam dokumentam Lucene izveido jaunu indeksa segmentu, taču tas ātri apvieno mazos segmentus ar lielākiem - tādējādi kopējais segmentu skaits tiek saglabāts mazs, tāpēc meklēšana paliek ātra. Lai optimizētu indeksu ātrai meklēšanai, Lucene var apvienot visus segmentus vienā, kas ir noderīgi reti atjauninātu indeksu gadījumā. Lai novērstu konfliktus (vai bloķētu pieskaitāmās izmaksas) starp rādītāju lasītājiem un rakstītājiem, Lucene nekad nemaina segmentus, bet rada tikai jaunus. Apvienojot segmentus, Lucene raksta jaunu segmentu un izdzēš vecos - pēc tam, kad visi aktīvie lasītāji to ir aizvēruši. Šī pieeja labi mērogojas, piedāvā izstrādātājam lielu elastību tirdzniecības indeksēšanas ātruma tirdzniecībā meklēšanas ātrumam un tai ir vēlamas I / O īpašības gan apvienošanai, gan meklēšanai.

Lucene indeksa segments sastāv no vairākiem failiem:

  • Vārdnīcas rādītājs, kas satur vienu ierakstu par katriem 100 vārdnīcas ierakstiem
  • Vārdnīca, kurā ir viens ieraksts katram unikālajam vārdam
  • Ievietošanas fails, kurā ir ieraksts par katru norīkošanu

Tā kā Lucene nekad neatjaunina segmentus uz vietas, tos var uzglabāt plakanos failos, nevis sarežģītos B kokos. Ātrai atgūšanai vārdnīcas rādītājā ir nobīdes vārdnīcas failā, bet vārdnīcā - iesūtījumu failā. Lucene arī īsteno dažādus trikus, lai saspiestu vārdnīcu un ievietotu failus - tādējādi samazinot diska I / O -, neradot ievērojamu CPU pieskaitāmo daļu.

Meklētājprogrammu novērtēšana

Citas plaši izmantotas atvērtā koda meklētājprogrammas ir Swish-E, Glimpse, libibex, freeWAIS un iSearch. Tāpat kā jebkura programmatūras pakete, katra no tām ir optimizēta lietošanai noteiktās situācijās; Bieži vien ir grūti izvietot šos rīkus ārpus paredzētajiem domēniem. Novērtējot meklētājprogrammu, apsveriet šādas funkcijas:

  • Papildu salīdzinājums ar partijas indeksēšanu: Dažas meklētājprogrammas atbalsta tikai pakešu indeksēšanu; Tiklīdz viņi izveido indeksu dokumentu kopai, jaunu dokumentu pievienošana kļūst sarežģīta, atkārtoti neindeksējot visus dokumentus. Papildu indeksēšana ļauj ērti pievienot dokumentus esošajam indeksam. Dažām lietojumprogrammām, piemēram, tām, kas apstrādā tiešsaistes datu plūsmas, pakāpeniska indeksēšana ir kritiska. Lucene atbalsta abus indeksēšanas veidus.
  • Datu avoti: Daudzas meklētājprogrammas var indeksēt tikai failus vai tīmekļa lapas. Tas apgrūtina lietojumprogrammas, kurās indeksētie dati nāk no datu bāzes vai ja vienā failā, piemēram, ZIP arhīvā, ir vairāki virtuāli dokumenti. Lucene ļauj izstrādātājiem piegādāt dokumentu indeksētājam, izmantojot a Stīga vai an InputStream, ļaujot datu avotu abstrahēt no datiem. Tomēr, izmantojot šo pieeju, izstrādātājam ir jānodrošina atbilstošie datu lasītāji.
  • Indeksēšanas vadība: Dažas meklētājprogrammas var automātiski pārmeklēt direktoriju koku vai vietni, lai atrastu indeksējamos dokumentus. Lai gan tas ir ērti, ja jūsu dati jau tiek glabāti šādā veidā, rāpuļprogrammas indeksētāji bieži nodrošina ierobežotu elastību lietojumprogrammām, kurām nepieciešama detalizēta kontrole pār indeksētajiem dokumentiem. Tā kā Lucene darbojas galvenokārt pakāpeniskā režīmā, tā ļauj lietojumprogrammai atrast un izgūt dokumentus.
  • Failu formāti: Dažas meklētājprogrammas var indeksēt tikai tekstu vai HTML dokumentus; citi atbalsta filtrēšanas mehānismu, kas piedāvā vienkāršu alternatīvu tekstu apstrādes dokumentu, SGML dokumentu un citu failu formātu indeksēšanai. Lucene atbalsta šādu mehānismu.
  • Satura marķēšana: Dažas meklētājprogrammas traktē dokumentu kā vienu žetonu plūsmu; citi atļauj dokumentā norādīt vairākus datu laukus, piemēram, "priekšmets", "abstrakts", "autors" un "pamatteksts". Tas pieļauj semantiski bagātākus vaicājumus, piemēram, "autors" satur Hamiltons UN ķermeņa satur Konstitūcija. "Lucene atbalsta satura marķēšanu, uzskatot dokumentus par lauku kolekcijām, un atbalsta vaicājumus, kas norāda, kurā (-os) laukā (-os) meklēt.
  • Stop-vārdu apstrāde: Parastie vārdi, piemēram, "a", "" un "un" the ", meklēšanas indeksam piešķir nelielu vērtību. Bet, tā kā šie vārdi ir tik izplatīti, to katalogizēšana ievērojami veicinās indeksēšanas laiku un indeksa lielumu. Lielākā daļa meklētājprogrammu neindeksēs noteiktus saucamos vārdus pārtraukt vārdus. Daži izmanto pieturas vārdu sarakstu, bet citi izvēlas apstāšanās vārdus statistiski. Lucēna apstrādā pieturas vārdus ar vispārīgākiem vārdiem Analizators mehānisms, kas tiks aprakstīts vēlāk, un nodrošina StopAnalyzer klase, kas izslēdz pieturas vārdus no ievades straumes.
  • Izcelsme: Bieži vien lietotājs vēlas, lai vaicājums par vienu vārdu atbilstu citiem līdzīgiem vārdiem. Piemēram, vaicājumam “lēkt”, iespējams, jāatbilst arī vārdiem “lecis”, “lecējs” vai “lec”. Tiek saukts vārda reducēšana līdz saknes formai stemming. Lucene vēl neīsteno stemming, bet jūs varētu viegli pievienot stumbru, izmantojot sarežģītāku Analizators klasē.
  • Vaicājuma funkcijas: Meklētājprogrammas atbalsta dažādas vaicājumu funkcijas. Daži atbalsta pilnīgus Būla vaicājumus; citi atbalsta tikai un vaicājumi. Daži ar katru trāpījumu atgriež “atbilstības” rādītāju. Daži var apstrādāt blakus vai vaicājumus - "meklēšanu" sekoja dzinējs "vai" Knicks netālu Celtics "- citi var meklēt tikai pēc atsevišķiem atslēgvārdiem. Daži var meklēt vairākos indeksos vienlaikus un sapludināt rezultātus, lai iegūtu nozīmīgu atbilstības rādītāju. Lucene atbalsta plašu vaicājumu funkciju klāstu, ieskaitot visas iepriekš uzskaitītās. Tomēr Lucene to dara neatbalsta vērtīgo Soundex vai “izklausās” vaicājumu.
  • Vienlaicīgums: Vai indeksā vienlaikus var meklēt vairāki lietotāji? Vai lietotājs var meklēt indeksā, kamēr cits to atjaunina? Lucene ļauj lietotājiem meklēt indeksā darījumus, pat ja cits lietotājs vienlaikus atjaunina indeksu.
  • Atbalsts, kas nav angļu valoda: Daudzas meklētājprogrammas netieši pieņem, ka angļu valoda ir mērķa valoda; tas ir acīmredzams tādās jomās kā stop-vārdu saraksti, izrietošie algoritmi un tuvuma izmantošana frāžu vaicājumu saskaņošanai. Kad Lucene iepriekš apstrādā ievades plūsmu caur Analizators klasē, ko nodrošina izstrādātājs, ir iespējams veikt valodas specifisku filtrēšanu.

Lai arī tas nebūt nav pilnīgs, iepriekš minētais saraksts piedāvā sākumpunktu, lai novērtētu meklētājprogrammu konkrētam projektam. Daži meklēšanas rīki ir slikti piemēroti noteiktiem uzdevumiem - izprotot lietojumprogrammas prasības, varat izvēlēties pareizo rīku šim darbam.

Izmantojot Lucene

Es ilustrēšu, kā izmantot Lucene, lai izveidotu, aizpildītu un meklētu indeksu. Skaidrības labad importa paziņojumi un izņēmumu apstrāde no izlases programmām ir izlaista. Šajās ilustrācijās meklēšanas indeksu esmu saglabājis failu sistēmā (indeksus var saglabāt jebkurā vietā, piemēram, atmiņā vai datu bāzē). Indeksētie faili ir vienkārši teksta faili. Izmantojot Lucene, jūs varat arī viegli indeksēt citus dokumentu formātus un dokumentus, kas nav saglabāti failos.

Izveidojiet indeksu

Vienkāršā programma CreateIndex.java izveido tukšu indeksu, ģenerējot IndexWriter objektu un uzdodot izveidot tukšu indeksu. Šajā piemērā direktorijas nosaukums, kurā tiks glabāts indekss, ir norādīts komandrindā.

public class CreateIndex {// use: CreateIndex index-directory public static void main (String [] args) met izņēmumu {String indexPath = args [0]; IndexWriter rakstnieks; // Indekss tiek izveidots, atverot IndexWriter ar // create argumentu kā true. rakstnieks = new IndexWriter (indexPath, null, true); rakstnieks.slēgt (); }} 

Indeksa teksta dokumenti

IndexFile.java parāda, kā indeksam pievienot dokumentus - komandrindā nosauktos failus. Katram failam IndexFiles izveido a Dokuments objekts, pēc tam zvana IndexWriter.addDocument lai to pievienotu indeksam. No Lūsenes viedokļa a Dokuments ir lauku kopa, kas ir nosaukuma un vērtības pāri. A Lauks var iegūt savu vērtību no a Stīga, īsiem laukiem, vai an InputStream, gariem laukiem. Izmantojot laukus, varat sadalīt dokumentu atsevišķi meklējamās un indeksējamās sadaļās un saistīt metadatus, piemēram, vārdu, autoru vai modifikācijas datumu, ar dokumentu. Piemēram, uzglabājot pasta ziņojumus, ziņojuma tēmu, autoru, datumu un tekstu varat ievietot atsevišķos laukos, pēc tam veidot semantiski bagātākus vaicājumus, piemēram, “tēma satur Java UN autors satur Gosling. "Zemāk esošajā kodā mēs katrā ierakstām divus laukus Dokuments: ceļš, lai identificētu sākotnējo faila ceļu, lai to varētu izgūt vēlāk, un ķermeņa, faila saturam.

public class IndexFiles {// use: IndexFiles index-path file. . . public static void main (String [] args) izmet izņēmumu {String indexPath = args [0]; IndexWriter rakstnieks; rakstnieks = new IndexWriter (indexPath, jauns SimpleAnalyzer (), false); par (int i = 1; i
$config[zx-auto] not found$config[zx-overlay] not found