Superhurtig søgning med Lucene

Lucene er en Java-baseret maskine til indeksering og søgning i tekst. Selv på et gammelt hakkebræt af en computer klarer Lucene uden problemer fritekstsøgning gennem 500 megabyte data med øjeblikkelige svar, som oven i købet er rangordnede. Vidunderet har mange anvendelsesmuligheder, og i to artikler bygger vi en offline-version af den åbne encyklopædi, Wikipedia, med basis i Lucene.

Wikipedia

Fritekstsøgning er nødvendigt, når man arbejder med store mængder af tekst. De fleste større websites tilbyder brugerne bedre eller dårlige søgefaciliteter, som kan finde nålen i den høstak, som stadigt voksende websites udgør. Gode søgemaskiner kan endog rangere resultaterne på forespørgslerne, således at de mest relevante forhåbentlig kommer først.

Problemet
Behovet for fritekstsøgning ses også af, at webbets mest besøgte site - Google - netop er en fritekst-søgemaskine, og endda en temmelig avanceret én af slagsen.

Der er ikke kun websites, som kan have behov for søgemaskiner. Der kan også være behov for søgemaskiner andre steder, hvor tekstmængderne hober sig op. Det kan være dokumenter samlet på et fællesdrev eller i forbindelse med løsninger til dokumenthåndtering.

Løsningen
I forbindelse med fritekstsøgning tænker man ofte på relationsdatabaser og SQL-operatoren LIKE, som benyttes i den sammenhæng. Det kan for eksempel se sådan ud:

SELECT ID FROM ARTIKLER WHERE ARTIKEL_TEKST LIKE '%sommer%';

Denne SQL-sætning vælger samtlige ID-numre fra en tabel, ARTIKLER, hvor feltet ARTIKEL_TEKST indeholder tekst-strengen "sommer". Procent-tegnene har samme mening som asterisk (*) i andre tekst-søgesystemer.

Hvis blot tabellen er tilstrækkelig lille, eller databasemaskinen er hurtig nok, så fungerer denne måde at implementere søgning på helt udmærket.

Men hvis antallet af rækker bliver meget stort, kan det give problemer. Så må man prøve med en egentlig tekst-søgningsmaskine.

Den slags problemer kan godt virke lidt akademiske, så lad os kigge på et konkret eksempel, hvor databasen kommer til kort.

Wikipedia
Encyklopædi-projektet Wikipedia går ud på at skrive en webbaseret encyklopædi - et leksikon - baseret helt på frivilligt arbejde. Alle kan skrive, og alle kan redigere i artiklerne i encyklopædien.

Det kan lyde som noget pjat, men Wikipedia indeholder faktisk mange udmærkede opslag - sammen med adskillige, som er knap så udmærkede. Wikipedia har netop rundet 100.000 artikler ifølge projektets bagmænd, og som man kan forestille sig, bliver det til et temmelig stort leksikon.

Teksterne i Wikipedia udgives under en slags open source-pendant for artikler, og derfor kan alle snuppe sig en kopi af den bagvedliggende database.

Indlejrede databaser

Offline
Hvis man stadig - som denne artikels forfatter - er koblet til nettet via et godt, gammeldags 56k-modem, så er der ikke så meget sjov ved en web-baseret encyklopædi. Da encyklopædiens indhold gerne må kopieres, melder ideen sig om at kreere en offline-version af encyklopædien. Så svært kan det vel heller ikke være, da det blot handler om at kunne søge i en stor tekstmængde.

Den tilgængelige kopi af Wikipedia, er en komprimeret version af et SQL-script til databasen MySQL, og den komprimerede version, som kan hentes fra Wikipedia website, fylder knap 100 megabyte. Udpakket fylder filen omkring 500 megabyte. Det er blot er en tekstfil, som indeholder en masse SQL INSERT-sætninger.

Ideen i vort lille projekt er altså at kunne søge disse data igennem på en helt almindelig skrivebordscomputer, og i særdeleshed på forfatterens halvgamle 1.0 GHz-hakkebræt. Det hele skal være gratis, så de værktøjer vi vælger at benytte, skal være open source eller freeware-baseret.

Til at starte med forsøgte vi at loade dataene ind i en række forskellige databaser. Vi valgte Java som platform, for det er forholdsvist nemt at have med at gøre, og Java er nogenlunde platformsuafhængigt, hvilket er helt i Wikipedias ånd - tror vi nok.

Indlejrede Java-databaser
Vi kiggede på en række open source Java-databaser, og der findes en del udmærkede af slagsen til indlejrede anvendelser, hvor databasen ikke fungerer som en server, men lever inde i et andet program.

Databasen Mckoi gav os i særdeleshed gode resultater. Mckoi er open source, ren Java, og indeholder et ganske pænt udsnit af de almindelige SQL- og JDBC-funktioner.

Det tog omkring fem timer at loade de 500 megabyte data ind i en tabel i Mckoi, og ved ikke-fritekstsøgninger fik vi efterfølgende svartider, som var helt acceptable.

Men da vi prøvede med en søgning i stil med det tidligere viste SQL-eksempel, kom Mckoi til kort. Det tog databasen omkring et minut at søge igennem de 500 megabyte, som dog var reduceret til 200 megabyte i Mckois database-format.

Et minut er uacceptabelt i forbindelse med interaktive søgninger, hvor der sidder en levende bruger bag skærmen og venter på resultaterne. Vi prøvede så med en ikke-Java løsning for at se, om en database født til computeren kunne klare opgaven bedre.

Lucene siger: Bingo!

Tilbage til MySQL
Her valgte vi naturligt nok MySQL, for den er udover at være hurtig også temmelig portabel. Ydermere er det den samme database, som vores Wikipedia-dump var genereret fra, så det var nemt at putte data ind i MySQL igen. Som en sidste og vigtigt tilgift indeholder MySQL specielle kommandoer, som optimerer kolonner til fritekst-søgning.

Men på vores ældre computer kom MySQL også til kort. Svartiderne var bedre en Mckois, men stadig for høje til at være anvendelige - omkring 30 til 40 sekunder, og det var vel af mærke med indeksering og fritekst-optimering af kolonnerne.

Indeksering med Lucene
Der måtte altså andre midler til for at løse vores problem. Efter eftertænksom grublen i flere minutter, kom vi i tanke om tekst-søgemaskinen Lucene, som er skrevet i Java, er open source og har et helt fantastisk ry.

Lucene er altså ikke en database. Den holder ikke på data, men indekserer kun tekster, som må gemme sig andre steder. Det kan oplagt være i en database, men det kan også blot være flade filer på et drev.

Lucene danner en række filer til indeksering, og de kan også gemmes på harddisken, men man kan også nemt implementere en løsning, hvor disse indekser gemmes et andet sted, eksempelvis i en database.

Bingo!
I modsætning til vores databaser, som brugte omkring fem timer på at tygge vores encyklopædi igennem, tog det blot Lucene 20 minutter at kværne de 500 megabyte. Det er ikke blot belejligt med den kortere processeringstid, det er også en vigtig faktor i udviklingsfasen. Artiklerne gemte vi blot som flade tekstfiler.

Dødsensspændte udførte vi vores allerførste fritekstsøgning i Lucene - og ikke et øje forblev tørt. Svarene kom prompte, helt øjeblikkeligt.

Lucene er nem at anvende, og indeholder masser af smarte søgemuligheder og faciliteter. I den næste artikel går vi tættere på det effektive bæst, og ser på, hvordan den anvendes og implementeres i praksis med udgangspunkt i vores offline-version af Wikipedia.

Annonce

Computerworld Events

Vi samler hvert år mere end 6.000 deltagere på mere end 70 events for it-professionelle.

Ekspertindsigt – Lyt til førende specialister og virksomheder, der deler viden om den nyeste teknologi og de bedste løsninger.
Netværk – Mød beslutningstagere, kolleger og samarbejdspartnere på tværs af brancher.
Praktisk viden – Få konkrete cases, værktøjer og inspiration, som du kan tage direkte med hjem i organisationen.
Aktuelle tendenser – Bliv opdateret på de vigtigste dagsordener inden for cloud, sikkerhed, data, AI og digital forretning.

Andre events | Charlottenlund

Roundtable: Skalér teknologien. Bevar kontrollen

Skab målbar forretningsværdi med cloud og AI. Bevar kontrollen over data, omkostninger og leverandørafhængigheder. Mød Årets CIO 2026 Claus Thomsen fra Lundbeck, og del erfaringer med andre digitale ledere i et roundtable om modernisering,...

It-løsninger | Online

ERP Insights 2026

Webinaret giver et samlet overblik over, hvordan ERP-landskabet ændrer sig, og hvilke arkitekturvalg der får direkte betydning for forretningens evne til at tilpasse sig.

Se alle vores events inden for it

Navnenyt fra it-Danmark

Softwarevirksomheden Idura, som udvikler løsninger til digital identifikation og autentifikation, har pr. 1. september 2026 ansat Maria Juliane Friedrichsen, 47 år,  som Office Manager. Hun skal især beskæftige sig med at holde overblik og sikre, at alt på kontoret kører, som det skal. Hun kommer fra en stilling som Office Manager hos Kontorhotellet H2M. Hun er uddannet professionsbachelor i ernæring og sundhed og har en korrekturlæseruddannelse. Hun har tidligere beskæftiget sig med korrekturlæsning og den daglige drift af kontorer. Nyt job

Maria Juliane Friedrichsen

Softwarevirksomheden Idura, som udvikler løsninger til digital identifikation og autentifikation,

EG Danmark A/S har pr. 17. august 2026 ansat Michael Banegas Madsen, 32 år,  som Senior Account Executive. Han skal især beskæftige sig med Ansvar for nysalg og vækst af eksisterende kunder, samt opbygning af kunderelationer på tværs af Jylland og Fyn. Han kommer fra en stilling som Senior Talent Attraction Specialist hos Danske Commodities A/S. Han er uddannet Kandidat i Corporate Communication fra Aarhus BSS. Han har tidligere beskæftiget sig med 6 års erfaring med rekruttering af tech-profiler i bl.a. Danske Commodities. Nyt job

Michael Banegas Madsen

EG Danmark A/S

Elbek & Vejrup A/S har pr. 1. august 2026 ansat Nathalie Kajberg Knudsen som Supportkonsulent i Evita/Forsyning. Hun skal især beskæftige sig med support af Evita/Forsyning samt bidrage til videreudviklingen af supportsetup på Evita og Appia. Hun kommer fra en stilling som support indenfor Kundeadministration og Afregning hos KMD Easy Energy. Hun har tidligere beskæftiget sig med kørselskoordinering og kørselsledelse hos FKS Slamson og Godik. Nyt job

Nathalie Kajberg Knudsen

Elbek & Vejrup A/S

Arctic Wolfs Network har pr. 1. september 2026 ansat Victor Dohlmann som Sales Director for Nordics. Nyt job

Victor Dohlmann

Arctic Wolfs Network