Mit dabei: einige tausenden Bücher: Acrobat PDF Dokumente mit 300-700 Seiten und bis zu 3 GB groß.
Zum Einsatz kam Lucene / Solr 4.0, welches seit Herbst 2012 als finale Version (nicht mehr Beta) vorliegt.
Für die Indexierung ganzer Dokumente, kann man bei Solr auf Tika zurückgreifen. Dies ist bereits in der Solr 3.x Version verfügbar.
In der Solr 4.0 Beispielkonfiguration ist darüber hinaus bereits der extracting request handler vorhanden.
Konfiguration Solr zur Indexierung von Dokumenten
<requestHandler name="/update/extract" startup="lazy" class="solr.extraction.ExtractingRequestHandler" > <lst name="defaults"> <str name="lowernames">true</str> <str name="uprefix">ignored_</str> <!-- capture link hrefs but ignore div attributes --> <str name="captureAttr">true</str> <str name="fmap.a">links</str> <str name="fmap.div">ignored_</str> </lst> </requestHandler>Dieser extracting request handler nutzt im Hintergrund Tika, um die an ihn übergebenen Dokumente zu analysieren. Dabei ist es egal, ob wir PDF Dokumente, Word (doc), Textdateien, Webseiten, also HTML Dokumente, u.s.w. übergeben. Das erleichtert die Arbeit erheblich, denn es müssen vorher die Dateien nicht mühsam in den einheitliches Format umgewandelt werden.
Tika, hinter dem exreacting request handler, analysiert darüber hinaus die Metadaten der Dokumente, bspw. die Metainformationen eines PDF Dokumentes (Autor, Datum, etc) oder einer HTML Datei.
Damit dies alles funktioniert, müssen in der Schema.xml entsprechende Felder vorhanden sein. Auch hier macht es uns Solr recht einfach, denn die Klassiker wie Author und co sind bereits vorhanden.
<field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false" />
<field name="title" type="text_general" indexed="true" stored="true" multiValued="true"/> <field name="subject" type="text_general" indexed="true" stored="true"/> <field name="description" type="text_general" indexed="true" stored="true"/> <field name="comments" type="text_general" indexed="true" stored="true"/> <field name="author" type="text_general" indexed="true" stored="true"/> <field name="keywords" type="text_general" indexed="true" stored="true"/> <field name="category" type="text_general" indexed="true" stored="true"/> <field name="resourcename" type="text_general" indexed="true" stored="true"/> <field name="url" type="text_general" indexed="true" stored="true"/> <field name="content_type" type="string" indexed="true" stored="true" multiValued="true"/> <field name="links" type="string" indexed="true" stored="true" multiValued="true"/>
<field name="content" type="text_de" indexed="true" stored="true" multiValued="true"/>Das passt vor allem deshalb so gut, da klassisch erstellte PDF's gleiche Bezeichnungen bei den Metainformationen haben. Also auch dort gibt es ein Feld author. Zusätzlich möchten wir noch weitere Informationen verarbeiten. Bspw. das Erstellungsdatum. Dazu fügen wir ein eigenes Feld hinzu:
<field name="datum" type="tdate" indexed="true" stored="true" multiValued="false" />
Curl zur Indexierung von Dokumenten mit Sol / Lucene
Interessant wird's nun mit der Frage, wie man die Dokumente indexiert, also nach Solr / Lucene importiert.Das ist abhängig von der Anwendung und den persönlichen Vorlieben und Fähigkeiten.
In unserem Fall nutzen wir CURL. Das geht aus der Linux Konsole heraus und auch aus PHP Skripten.
Wichtig ist dabei die Syntax. Damit definieren wir die Datei, die analysiert und indexiert werden soll sowie zusätzliche Felder, die wir für jede Datei noch speichern/verarbeiten wollen (bspw. datum und id)
curl "http://localhost:8080/solr/collection1/update/extract/ ?literal.id=AH3DB2 &literal.datum=2012-01-01T09:22:38.00Z" -data-binary "@/pfad/zu/meinemDokuemnt.pdf" -H "Content-type:application/pdf"
Was passier hier?
Mit literal.id=AH3DB2 setzen wir die unique ID (Feld "id" in der schema.xml) des Dokumentes. Dieser Wert ist optional als CURL Parameter. Alternativ hätte Solr bzw. Tika einen Wert gesetzt, in aller Regel den Dateinamen. Mit dem literal. wird markiert, dass es sich hierbei nachfolgend um eine Feldbezeichnung handelt.
Mit literal.datum="2012-01-01T09:22:38.00Z" setzen wir unser zusätzliches Feld datum. Abschließend definieren wir die Datei, die zu solr gesendet werden soll: -data-binary "@/pfad/zu/meinDokuemnt.pdf" und definieren abschließend den mime-typ des Dokumentes.
Zum Schluss noch ein commit, damit die Daten im Index auch sichtbar sind. Auch das erreichen wir mittels curl
curl "http://localhost:8080/solr/collection1/update/extract?softCommit=true"Fertig