Tags: Database | Oracle | XML

Indexeren van BLOB-gegevens met behulp van Solr's DataImportHandler

Door Jonck van der Kogel

We leven in een informatietijdperk waarin mensen en bedrijven steeds grotere hoeveelheden data opslaan. Echter, zonder een goede zoekfunctie is deze informatie van generlei waarde. Goede zoekfunctionaliteit wordt daarom steeds belangrijker. Zeker bij legacy-systemen is dit geen sinecure. Een situatie waar u tegenaan kunt lopen is als documenten in binaire formaten, zoals pdf, MS Word, MS Excel en MS Powerpoint worden opgeslagen als BLOB (Binary Large Object) in een SQL-database. Om hierin te zoeken, lijkt op het eerste gezicht een hele klus. Maar met behulp van de DataImportHandler van Solr en een transformator, blijkt dit helemaal niet zo moeilijk te zijn. In dit artikel wordt het opzetten en het gebruik beschreven van Solr DataImportHandler en een aangepaste transformator voor het indexeren van pdf-documenten die in een Oracle-database als BLOB zijn opgeslagen.
Voor een meer uitgebreide beschrijving van het gebruik van de DataImportHandler, zie http://wiki.apache.org/solr/DataImportHandler.

Configuratie

Voordat Solr kan herkennen dat met de DataImportHandler en een aangepaste transformer wordt gewerkt, moet eerst een configuratieslag gemaakt worden. De drie bestanden die moeten worden aangepast, zijn: • data-config.xml
• solrconfig.xml
• schema.xml

data-config.xml

De eerste stap is het opzetten van data-config.xml. Dit bestand bevat de definitie van de databron, de velden die zullen worden geïndexeerd en de query die bepaalt hoe de data uit de database wordt opgehaald. Hieronder staat een voorbeeld van dataconfiguratie:

Het dataSource gedeelte spreekt voor zich; hier wordt bepaald hoe je de verbinding met de gegevensbron opzet. Vergeet niet om ook de driver op te nemen die je specificeert op de classpath van Solr. In mijn situatie draaide ik Solr met behulp van Tomcat zodat ik de Oracle driver moest toevoegen op de WEB-INF/lib directoriy van de solr webapp. Het documentgedeelte van de data-config.xml beschrijft hoe Solr je gegevens indexeert. In mijn geval had ik documenten genaamd “distributions” die moesten kunnen worden gevonden op veldnamen als auteur, titel, inhoudsopgave en datum van publicatie. Elke distributie kan meerdere pdf-bestanden als bijlage hebben. Om dit op te zetten, definieer je een child entity binnen de entity tag. De distributietabel heeft een primaire sleutel “id” die wordt gebruikt om de bijlagen te koppelen. Let op het gebruik van Expression Language binnen de child entity query. Het attribuut ‘transformer’ van de child entity vertelt Solr welke implementatie van Transformer deze entiteit nodig heeft om het om te kunnen zetten naar iets dat Solr kan indexeren. Het veld dat de actuele BLOB bevat heft een attribuut blob=”true”; Hier komen we snel op terug.

solrconfig.xml

Met data-config.xml op de juiste wijze geconfigureerd, is het nu tijd om de DataImportHandler in Solr aan te zetten en Solr te laten weten waar data-config.xml staat. Dit wordt gedaan door het onderstaande toe te voegen aan solrconfig.xml:

schema.xml

De laatste stap in het configureren van Solr is dat je de velden beschrijft van data-config.xml in schema.xml. In mijn voorbeeld, zou dit er als volgt uitzien:

Zoals je kunt zient komen de velddefinities verbatim overeen met hetgeen is opgezet in data-config.xml. Het enige dat aanvankelijk niet goed ging, was dat ik was vergeten om het multiValued= “true” attribuut te zetten voor de velden van de child entity. Het bleek dat zonder dit attribuut alleen de eerste bijlage werd geïndexeerd. Dit zorgde ervoor dat veel zoekopdrachten niet het gewenste resultaat opleverden. Na veel debuggen en het doorspitten van de code van DataImportHandler,ontdekte ik dat het simpelweg een kwestie was van het juist instellen van het multiValued attribuut. Nadat dit was gebeurd, werden alle bijlagen correct geïndexeerd.

Custom Transformer

Nu komen we bij de code van onze aangepaste Transformer. Ik heb PDFBox 0.7.3 gebruikt om de pdf-bestanden te ontleden. Terwijl Apache het PDFBox project heeft overgenomen, was er op het moment van schrijven nog geen officiele release van PDFBox vanuit Apache. Daarom koos ik ervoor om te werken met de laatste stabiele versie van PDFBox. PDFBox heeft een afhankelijkheid met FontBox en als je pdf’s bepaalde veiligheidsbeperkingen hebben, zul je enkele BouncyCastle jars nodig hebben om deze te omzeilen. Hieronder de Maven2 POM voor dit project:

Ik heb de PDFBox en FontBox jars handmatig moeten downloaden, en vervolgens opgeslagen in ons eigen Maven repository. De custom Transformer moet worden uitgebreid met org.apache.solr.handler.dataimport.Transformer om de transformRow methode te overschrijven. De methode krijgt de huidige rij van de resultaatset van de child entity query doorgegeven als een Map <String,Object> en een Context object waarvandaan je alle velden van de child identity kunt afleiden. Door alle velden van de huidige entiteit af te gaan kun je testen of een veld het “blob” attribuut heeft. Als dit zo is, weten we dat we te maken hebben met een BLOB, waarna we het kunnen ophalen van de huidige rij. We lezen de tekst van de pdf met behulp van PDFBox and stoppen de ontlede tekst terug in het rijobject door de kolomnaam te gebruiken (in ons geval “FILE”)  als de sleutel. De BLOB is nou omgezet naar tekst, die vervolgens wordt doorgegeven aan Solr die nu in staat is om deze te indexeren.



Maak een jar die de bovenstaande class bevat en zet dit, samen met de afhankelijkheden, op de classpath van Solr. Herstart Solr. Als je Solr lokaal hebt draaien, kun je nu een full import starten via onderstaande url: http://localhost:8080/solr/dataimport?command=full-import In ons geval bedroeg het indexeren ongeveer 20 minuten. Als dit klaar is, ga naar: http://localhost:8080/solr/admin/. Dit is de Solr admin pagina die je kunt gebruiken om enkele test queries uit te voeren. Als het goed is, zou je bestanden moeten kunnen zoeken die zijn opgeslagen als BLOBs in je eigen SQL database.

Jonck van der Kogel is een software engineer en manager van het Java Competence Center bij HintTech. Hij heeft meer dan tien jaar ervaring in softwareonwikkeling, met name in de hoek van J2EE webapplicaties en –services

Lees meer over HintTech
Ga terug naar We Love IT uitgave 2 - 2009
Advertentie