Zoekindex Lucene verder geoptimaliseerd

Meresco, onze library van search en retrieval software, gebruikt Lucene voor de zoekindex. Lucene is ontwikkeld in Java; onze code is geschreven in Python. Python biedt verschillende mogelijkheden om deze Java code te gebruiken. De open source Software Foundation Apache biedt de mogelijkheid de Java code beschikbaar te maken binnen Python. Dit kan met PyLucene (http://lucene.apache.org/pylucene/).

Opvallend

Tot voor kort maakte we alleen maar gebruik van PyLucene om onze indexen aan te spreken. Op onze software draait continu een monitoring systeem, dat ons inzicht geeft in performance. We merkten steeds vaker dat er geheugen ‘kwijt’ was. Een ander opvallend fenomeen was dat het nodig werd de indexen eens in de zoveel tijd te herstarten, omdat deze anders ‘Out of memory’ gingen. Duidelijk: er was iets aan de hand, en we doken erin. Ondanks veel memory profiling en het bekijken van heap-dumps, die laten zien waaruit het gebruikte geheugen was opgebouwd, kwamen we niet tot een bevredigende conclusie waarom de garbage collector zijn werkt niet goed deed. Java objecten, waarvan wij zagen dat die wel konden worden opgeruimd, werden níet opgeruimd.

Zagen wij iets over het hoofd? Hadden we echt een geheugenlek? Of had de garbage collector te veel te doen om dit binnen de gewenste tijden op te kunnen ruimen?

Aankijken

Ondertussen bleven onze indexen groeien, alsook het aantal queries aan de indexen. Tot we uiteindelijk voor sommige indexen meerdere keren per dag een ‘out of memory error’-melding kregen. Om wat ruimte te scheppen, zetten we het automatisch bijwerken van de indexen daarom uit, en voerden we die handmatig uit op rustige momenten van de dag. Dit gaf voorlopig ruimte, maar dat is geen duurzame oplossing. Tijd voor actie dus.

Actie

Wij hebben een tijdje gebruik gemaakt van het open source enterprise search platform Solr, dat in Java is geschreven. Solr maakt gebruik van de zoekindex-functionaliteit van Lucene, en biedt een http-service aan om queries te stellen. Wat zou er gebeuren als wij ook deze strategie zouden volgen? We zouden Lucene in Java gaan draaien, de ‘native’ taal. Het combineren van garbage in Python en Java komt dan niet meer voor en lost eventuele problemen die we daarmee hebben op. We waren ook heel benieuwd wat er met de performance zou gebeuren.

We schreven onze eigen code om naar Java, bovenop Lucene, en plaatsten er een http-service voor. Na een aantal dagen Java code schrijven, met in het achterhoofd dat het ons zowiezo zou helpen bij het vinden van een oplossing, lukte het ons om weer een werkende versie te krijgen.

Performance testen

De code installeerden we op een acceptatie server met veel data. De eerste testresultaten waren erg bemoedigend. Ze gaven aan dat de indexen zelfs meer dan dubbel zo snel waren geworden. Dat was een beter resultaat dan we verwacht hadden. Maar de grote vraag: is ons geheugenprobleem opgelost, was nog niet beantwoord. We lieten daarom een duurtest los op de oplossing. We bestookten het systeem urenlang met een continue load, waarvan we wisten dat het oude systeem daar al snel onder zou bezwijken. En jawel: er kwamen geen geheugenproblemen meer voor.

Gemiddelde responstijden voor en na release op 16 december

Gemiddelde responstijden voor en na release (op 16 december 2015)

In de roos

Het leek er sterk op dat we ons probleem opgelost hadden. Ons vermoeden dat het in puur Java beter zou moeten gaan, klopte. Als klap op de vuurpijl kregen we er ook nog een enorme performance verbetering bij.

Uiteindelijk hebben we deze aanpak een tijdje laten meedraaien op de acceptatie-omgeving om er zeker van te zijn dat de werking probleemloos was. Intussen is het alweer een tijdje gereleased naar een productie omgeving, waar het nu vlekkeloos draait.

 

Open Source Erfgoed Software: Meresco

In Schudden voor gebruik – Nationale strategie voor landelijke voorzieningen voor digitaal erfgoed (zie Openbare Review Nationale Strategie Digitaal Erfgoed) wordt gezegd:

“Het ICT-maatwerk heeft in de voorbije jaren veel kunnen betekenen voor instellingen en hun klanten, maar leidt nu ook tot beperkingen bij de ontwikkeling van een goed functionerend informatienetwerk. Er moet daarom nu meer aandacht uitgaan naar gestandaardiseerde en toegankelijke basisvoorzieningen, om daar bovenop eenvoudiger en voordeliger maatwerktoepassingen te kunnen maken.

80/20
Ja! In de Erfgoedsector kan 80% van de software gedeeld worden. Je doet zoveel mogelijk samen, zonder dat je wordt beperkt in je vrijheid om je eigen ding te realiseren. 20% maatwerk daar bovenop is het interessante deel waarmee je je onderscheidt en waar besteding van het budget te rechtvaardigen is, omdat het meerwaarde oplevert.

Nu al beschikbaar
Wat dat betreft is er goed nieuws. In de afgelopen jaren heeft Seecr al veel gemeenschappelijke software ontwikkeld voor het publiceren en toegankelijk maken van grote hoeveelheden data. Deze software is:

  • beschikbaar onder Open Source licentie;
  • onder copyright van erfgoedinstellingen;
  • gesmeed tot een geheel van herbruikbare componenten;
  • als source gepubliceerd op GitHub;
  • als binaire packages installeerbaar op Debian of RedHat;
  • bewezen technologie: productierijp en grootschalig inzetbaar.

Bewezen technologie
Vandaag de dag draaien grote landelijke netwerken op deze software. In het domein van onderwijs, erfgoed, openbare en wetenschappelijke bibliotheken. Deze bevatten zeer veel gecombineerde data en hebben dagelijks een groot publiek van institutionele gebruikers en eindgebruikers.

bron Elsbeth Kwantbron: Elsbeth Kwant
In bovenstaande afbeelding van Elsbeth Kwant geeft de oranje kleur in stam en wortels aan waar deze software aanwezig is. Deze data wordt al dagelijks gebruikt en onder elkaar uitgewisseld.

Verbetering componenten
Herbruikbare componenten bedenk je niet, die groeien. Ze ontstaan als gevolg van hergebruik: de eerste maakt iets, de volgende past het aan en bij de derde kun je gaan spreken van een herbruikbaar component. Als dat enkele jaren doorgaat, ontstaat er een enorme hoeveelheid aan meer generieke en steeds betere componenten. Dit is precies wat met deze software de afgelopen jaren is gebeurd en wat dagelijks plaatsvindt.

Copyright en licenties
Een open source licentie is mooi, maar daarmee heb je nog geen controle over wat er met die software gebeurt, want die ligt bij de copyright eigenaar. Het copyright van deze software ligt bij grote spelers uit de erfgoed sector waaronder Stichting Beeld en Geluid, de Koninklijke Bibliotheek, de Koninklijke Nederlandse Academie van Wetenschappen (KNAW) en Stichting Kennisnet.

Publicatie en packaging
De publicatie en packaging is de afgelopen jaren om niet gedaan door Seecr. De binaire packages kunnen in enkele minuten geïnstalleerd worden. In een handomdraai heb je dan een eigen netwerk waar je een eigen toepassing op kunt bouwen zonder je zorgen te hoeven maken over de gemeenschappelijke delen. Een goed voorbeeld hiervan is Narcis die door DANS wordt onderhouden.

Heeft deze software al een naam? Ja! In 2007 hebben wij met vier partijen die hiermee begonnen zijn de naam Meresco bedacht. Onder die naam is het sindsdien gepubliceerd en onderhouden tot op de dag van vandaag: zie github.com/seecr?query=meresco

Wat is er met deze software allemaal mogelijk? In een volgende blog zal ik hier dieper op in gaan.

Update HBO Kennisbank

De afgelopen weken hebben we gewerkt aan HBO Kennisbank. De release hiervan moet nog plaatsvinden, maar graag laten we alvast zien wat er is toegevoegd. Tot op heden was niet duidelijk zichtbaar welke hoge scholen bij HBO kennisbank zijn aangesloten. Daar komt nu verandering in.

HBO Kennisbank

Wat wij hebben gedaan is het filter uitgebreid. Alle deelnemende scholen worden bovenaan in alfabetische volgorde getoond met daarbij de vermelding hoeveel artikelen er beschikbaar zijn. De technische verbetering zit hem met name in het anders tonen van de organisatiefacetten.

Daarnaast hebben we ook de bestaande software bijgewerkt. We zorgen er graag voor dat onze klanten kunnen profiteren van de nieuwste functionaliteiten en prestaties die gerealiseerd zijn in andere projecten gebaseerd op dezelfde software componenten.

 

Waarom Linked Data?

Organisaties beschikken over steeds meer waardevolle informatie. Voor een goede samenwerking intern en extern is het van belang dat die informatie gedeeld en gevonden kan worden. Voor het delen van informatie worden vaak afspraken gemaakt, die op een later moment te rigide blijken te zijn. En bij het zoeken ligt de nadruk noodgedwongen nog vaak op het (toevallig) voorkomen van een woord in een lap tekst.

Linked Data is een vorm om informatie beschikbaar te stellen die meer mogelijkheden biedt, doordat
• onderlinge relaties expliciet gemaakt worden;
• software deze vorm automatisch kan verwerken: bekende relaties worden herkend;
• bepaalde datavelden niet bij voorbaat verplicht zijn;
• waardoor er altijd ruimte blijft om later meer data/relaties toe te voegen, ook door derden.

De belofte van Linked Data

Alles wat binnen de data de moeite waard is om te beschrijven, zoals bijvoorbeeld een kunstwerk, een persoon of een locatie, krijgt een unieke identifier. Verbanden ontstaan door relaties te leggen tussen de verschillende ‘concepten’ op basis van deze identifiers. RDF biedt hiervoor een eenduidig formaat (triples) waarbinnen de vrijheid bestaat om te kiezen welke relaties daarvoor het meest van toepassing zijn. Bovendien kunnen er in RDF altijd relaties worden toegevoegd, ook vanuit andere bronnen, zodat de semantische verbanden rijker worden naarmate daar behoefte aan ontstaat.

Specialisme van Seecr
Seecr is gespecialiseerd in het inrichten van een (software) infrastructuur voor het verwerken en snel doorzoekbaar maken van grote hoeveelheden data voor veel gebruikers. Wanneer die data als linked data afkomstig is uit verschillende bronnen, kan er sprake zijn van verschillen in rijkheid en structuur. Daarom is het van belang om bij de bron al goed te kiezen welke relaties gebruikt worden om de data te beschrijven. Beschrijf zoveel mogelijk relaties uit gangbare RDF vocabularies (zoals Dublin Core, FOAF, SKOS) en daarnaast eventueel meer specifieke (of zelfs proprietary) relaties voor zover dat richting de eindgebruiker toegevoegde waarde kan hebben.

Daarnaast is het noodzakelijk om binnen de infrastructuur voorzieningen te treffen om de verschillende objecten op een eenduidige manier vindbaar te maken. Onze oplossing daarvoor bouwt weer voort op de Linked Data filosofie met behulp van zogenaamde Open Annotations.

Gericht op eindgebruiker
Wij zijn altijd gericht op het toepassen van de juiste gereedschappen om op een praktische manier data nuttig te maken voor de eindgebruiker. Linked Data biedt vergaande mogelijkheden, waarvan we voor specifieke (deel)problemen dankbaar gebruik maken. Een waardevolle aanvulling in onze ‘gereedschapskist’ Meresco.

Autocomplete met Solr

Autocomplete is een functie die al langere tijd beschikbaar is in de systemen die met Meresco gebouwd worden, maar bij Seecr en haar opdrachtgever Kennisnet bestond de behoefte aan een duidelijk overzicht van de verschillende methodes voor een autocomplete functie.

Meresco levert die functies via Solr. Op de Meresco blog analyseert Hendrik vier methodes van autocomplete die door Solr 4.0 worden aangeboden.

Autocomplete met Solr (Dutch)

Autocomplete is een functie die al langere tijd beschikbaar is in de systemen die met Meresco gebouwd worden, maar bij Seecr en haar opdrachtgever Kennisnet bestond de behoefte aan een duidelijk overzicht van de verschillende methodes voor een autocomplete functie.

Meresco levert die functies via Solr. Hieronder analyseren we vier methodes van autocomplete die door Solr 4.0 worden aangeboden op basis van de volgende criteria.

De methode:

  1. geeft aanvulling op velden met één waarde (bijvoorbeeld: datum=01052013) of met meerdere waarden (bijvoorbeeld: tags=leuk, spannend).
  2. kan achteraan , maar ook vooraan of middenin aanvullen: “auto”, “mobiel” en “autobiel” leveren “automobiel” op.
  3. geeft aanvullingen binnen een zoekresultaat (bijvoorbeeld: aanvulling binnen het resultaat van de vorige zoekvraag) of op de gehele index.
  4. geeft (exacte) aantallen voor de te verwachten resultaten.
  5. kan snel aanvullen uit een lijst met zeer veel verschillende waarden (>100.000).
  6. werkt op een standaard index, of op een apart te bouwen index.

De vier methodes voor autocomplete in Solr (en Meresco) werken op basis van:

  1. De Facet-functie
  2. Alle Termen in de Index
  3. De Suggester Component
  4. Een N-Grammen Index

De Facet-functie
Met behulp van de standaard facet-functie kunnen alleen achteraan aanvullingen gegenereerd worden. Dit werkt erg efficiënt, ook binnen zoekresultaten. Het mooie er van is dat bij elke term het te verwachten aantal resultaten getoond kan worden. Met erg veel termen wordt het echter wel trager.

Voordelen:
–       Geeft aanvullingen in velden met meerdere waarden.
–       Geeft aanvullingen binnen een zoekresultaat.
–       Geeft exacte aantallen voor de te verwachten resultaten.
–       Te gebruiken met een standaard index.

Nadelen:
–       Kan alleen achteraan aanvullen.
–       Wordt minder snel bij zeer veel verschillende waarden.

Alle Termen in de Index
Deze methode geeft aanvullingen op basis van alle geïndexeerde waarden in een index. Het ondersteunt aanvullen achteraan, vooraan en middenin. Maar alleen achteraan werkt snel, ook bij zeer veel waarden in de index.

Voordelen:
–       Geeft aanvullingen in velden met meerdere waarden.
–       Kan achteraan, vooraan en middenin aanvullen.
–       Te gebruiken met een standaard index.
–       Werkt efficiënt met zeer veel verschillende waarden.

Nadelen:
–       Vooraan en middenin aanvullen werkt niet efficiënt.
–       Alleen een benadering van het aantal te verwachten resultaten.
–       Kan geen aanvullingen geven binnen een zoekresultaat.

De Suggester Component
Via de Suggester component kan een aanvulling gedaan worden door het aan te vullen woord te zien als woord waarvoor spellingscontrole gedaan moet worden. Dit werkt efficiënt voor aanvulling achteraan, vooraan en middenin door middel van een speciale index. Het mooie van deze oplossing is dat er verschillende algoritmen kunnen worden gekozen om de aanvulling te produceren.

Voordelen:
–       Geeft aanvullingen in velden met meerdere waarden.
–       Kan achteraan, vooraan en middenin aanvullen.
–       Werkt efficiënt met zeer veel verschillende waarden.

Nadelen:
–       Kan geen aanvullingen geven binnen een zoekresultaat.
–       Geen informatie over het aantal te verwachten resultaten.
–       Er moet een speciale index (tree) voor onderhouden worden.

Een N-Grammen Index
Deze oplossing wijkt sterk af van de andere. De aanvullingen gaan op basis van een query op een speciale index van delen van woorden. Het woord “snel” wordt hierin geïndexeerd als “sn”, “ne” en “el”. Omdat dit een normale zoekopdracht is, geeft dit geen aanvullingen terug, maar moet dit gecombineerd worden met de facet-functie of het ophalen van opgeslagen waarden. Het mooie aan deze oplossing is dat het gemakkelijk uitgebreid kan worden met speciale spellingcheckers of fonetische suggesties.

Voordelen:
– Kan achteraan, vooraan en middenin aanvullen.
– Geeft exacte aantallen voor de te verwachten resultaten in combinatie met de facet-functie.
– Werkt binnen een zoekresultaat.
– Werkt efficiënt met zeer veel verschillende termen.

Nadelen:
– Niet geschikt voor velden met meerdere waarden.
– Er moet een speciale n-gram index voor worden opgebouwd.

Samenvatting
In onderstaande tabel worden de voor en nadelen naast elkaar gezet. Daaruit is duidelijk op te maken dat de verschillende methodes heel verschillend scoren op onze criteria.

  Facet-functie Termen Suggester N-Grammen
Meerdere waarden per veld

+

+

+

Achteraan

Vooraan

Middenin

+

+

+/-

+/-

+

+

+

+

+

+

Binnen een zoekresultaat

+

+

Exacte aantallen

+

+

Veel verschillende waarden

+

+

+

Index

standaard

standaard

tree

n-gram

Conclusie
Uit de resultaten komt naar voren dat voor een bepaalde toepassing een specifieke methode beter werkt dan andere. In twee gevallen is er ook een speciale index nodig om het goed, en efficiënt, te laten werken. Het kiezen van de juiste autocomplete methode is daarom dus een zaak van grondige analyse van de wensen.

Een nieuwe versie van Meresco (v. 4)

Meresco is de Open Source componenten library die in samenwerking met klanten is ontwikkeld door Seecr. We hebben een aantal nieuwe ideeën en upgrades bij elkaar gevoegd en opnieuw uitgebracht onder de naam Meresco 4.

Nieuwe en/of verbeterde componenten:

  • Lucene 3.2
  • Owlim
  • Python 2.6
  • Nieuwe Weightless 0.7
  • Asynchrone I/O
  • Datacompressie
  • SRU 1.2
  • Parallel harvesten
  • Vele performance verbeteringen

Een belangrijke verbetering aan Meresco 4 is dat je makkelijker kunt koppelen met andere platforms, hierdoor kun je bestaande investeringen beter benutten en ben je vrijer als het gaat om technologie keuzes. We zijn ook trots om te vermelden dat tijdens het in productie nemen van Meresco 4 bij één van onze opdrachtgevers is gebleken dat het zoeken met deze laatste versie een stuk sneller is geworden.

Meresco 4 is als installeerbare packages beschikbaar voor Debian (free) en Red Hat Enterprise.

Software repositories – Meresco 4
Technische details van upgrade – Meresco changesets
Website Meresco.org