Federlesen #10: Von FormatĂĽbersetzern, Textverstehern und Textsuchern

Eine komfortable Volltextsuche gehört zu den wichtigen Funktionen vieler Anwendungen. Viele Entwickler verwenden dafür Apache-Komponenten wie Lucene, Solr, Tika oder UIMA.

vorlesen Druckansicht
Lesezeit: 17 Min.
Von
  • Frank Pientka
Inhaltsverzeichnis

Eine komfortable Volltextsuche gehört zu den wichtigen Funktionen vieler Anwendungen. Viele Entwickler verwenden dafür Apache-Komponenten wie Lucene, Solr, Tika oder UIMA.

Die Suchmaschine Lucene wurde von Doug Cutting, dem derzeitigen Vorsitzenden der Apache Software Foundation, entwickelt und 2001 an das Jakarta-Projekt, den Vorgänger des heutigen Incubators, übergeben, bevor sie sich 2005 zu einem Apache-Hauptprojekt mauserte. Lucene kommt in vielen Projekten und Produkten zum Einsatz, zum Beispiel in Salesforce, ElasticSearch, Twitter, LinkedIn, IBMs OmniFind Yahoo Edition oder Eclipse. Neben der Java-Variante, auch Lucene Core genannt, existieren Portierungen für andere Programmiersprachen, beispielsweise Lucy (Lucene4c), PyLucene (Python) oder Lucene.Net (C#).

Lucene bietet eine API mit vielen Indizierungs- und Suchalgorithmen an, die Entwickler gut anpassen und in Anwendungen integrieren können. Damit lassen sich spezielle Sucharten – etwa eine mehrsprachige Suche unter Berücksichtigung von Datumsbereichen oder Geoinformationen – durchführen. Zum schnellen Einstieg in Lucene benötigen Anwender keine Programmierkenntnisse. Sie müssen nur die mit ausgelieferten Demobeispiele aufrufen. Mit

java -cp core\lucene-core-4.0.0.jar;analysis\common\
lucene-analyzers-common-4.0.0.jar;demo\lucene-demo-4.0.0.jar
org.apache.lucene.demo.IndexFiles -docs docs

indizieren sie Lucene-Dokumente im Verzeichnis docs. Mit dem Aufruf

java -cp core\lucene-core-4.0.0.jar;analysis\common\
lucene-analyzers-common-4.0.0.jar;queryparser\
lucene-queryparser-4.0.0.jar;demo\lucene-demo-4.0.0.jar
org.apache.lucene.demo.SearchFiles -query Lucene

können sie den Index nach dem Wort "Lucene" durchsuchen und sich die ersten zehn Ergebnisse anzeigen lassen. Weitere Suchoptionen werden mit dem Parameter -h angezeigt. Wenn man sich einen Überblick über die am meisten indizierten Ausdrücken verschaffen möchte, geht das über den Aufruf von

java -cp core\lucene-core-4.0.0.jar;misc\lucene-misc-4.0.0.jar 
org.apache.lucene.misc.HighFreqTerms index

Mit java org.apache.lucene.index.CheckIndex index lässt sich der Inhalt und der Zustand des Index kontrollieren. Die Lucene-Index-Toolbox Luke ermöglicht es, mit dem Index eine grafische Oberfläche zu bearbeiten. Der Aufruf erfolgt mit

java -jar lukeall-4.0.0-ALPHA.jar

Auf der Einstiegsseite von Luke sieht der Entwickler neben statistischen Informationen zum Index, welche Felder er enthält und welche Ausdrücke am meisten indiziert wurden. Man kann Abfragen mit unterschiedlichen Analisierern pro Feld absetzen und sich die Suchergebnisse anzeigen lassen. Im Contrib-Verzeichnis (vor der Version 4.0) oder in den entsprechend benannten Unterverzeichnisse (ab der Version 4.0) der Lucene-Installation der Entwickler weitere Erweiterungen, etwa phonetische Analisierer, Facettensuche, Autovervollständigung, Rechtschreibkorrektur oder die Möglichkeit, Fundstellen in Suchergebnissen hervorzuheben.

Solr, ein Akronym von Search on Lucene and Resin, ist ein auf Lucene beruhender verteilter Volltextserver. Der Server entstand bei CNET und wurde 2006 an die ASF übergeben. Seit 2007 wird Solr als Unterprojekt von Lucene entwickelt. Über ein Plug-in-Konzept ist Solr gut erweiterbar und über die REST-Schnittstelle gut integrierbar. Zusätzlich bietet Solr eine umfangreiche Konfigurierbarkeit, eine komfortable Verwaltungsoberfläche und gute Überwachungsmöglichkeiten, sodass namhafte Unternehmen wie IBM Solr als Suchtechnik verwenden.

Solr stellt seine Flexibilität nicht zuletzt dadurch unter Beweis, dass es sich entweder mit dem Jetty- oder dem Tomcat-Webserver einsetzen lässt. Der Entwickler startet den Server im Solr-Hauptverzeichnis mit java -jar start.jar. Anschließend kann er darauf über http://localhost:8983/solr/admin/ im Browser zugreifen.

Zunächst kann er mit http://localhost:8983/solr/admin/file/?contentType=text/xml;charset=utf-8&file=solrconfig.xml die zentrale Solr-Konfigurationsdatei sowie mit http://localhost:8983/solr/admin /schema.jsp die Definitionen und den Inhalt des Index in der Datei schema.xml anschauen. Über http://localhost:8983/solr/admin/luke lässt sich sogar eine Teilfunktion von Luke ausführen. Zusätzlich kann man eine Facettensuche unter http://localhost:8983/solr/browse nutzen, die sich einfach über Velocity-Vorlagen anpassen lässt. Bei der Verwendung des Tomcat muss der Entwickler in der web.xml der installierten Solr-Anwendung (apache-solr-4.0.0.war) den Pfad zu einer Solr-Konfiguration setzen, indem er dort den folgenden Abschnitt auskommentiert.

<env-entry>
<env-entry-name>solr/home</env-entry-name>
<env-entry-value>C:\apache-solr-4.0.0\example\solr</env-entry-value>
<env-entry-type>java.lang.String</env-entry-type>
</env-entry>

Alternativ kann er auch die Java-Optionsvariable set JAVA_OPTS=-Dsolr.solr.home=C:\apache-solr-4.0.0\example setzen.

Die Kommunikation mit dem Solr-Server erfolgt ĂĽber das REST-Protokoll. Mit einfachen HTTP-Kommandozeilenwerkzeugen wie wget oder curl kann man die Indizierung oder die Suche anstoĂźen. Um eine Datei zur Indizierung an den Solr-Server zu ĂĽbergeben, genĂĽgt der Aufruf

curl http://localhost:8983/solr/update --data-binary solrconfig.xml
-H 'Content-type:application/xml'

Ăśber

wget -qO- http:"//localhost:8983/solr/select?q=*:*&wt=json" 

lassen sich Suchergebnisse im JSON-Format zurückgeben. Alternativ können Entwickler Solr aus jeder Programmiersprache mit einer REST-Bibliothek oder noch komfortabler mit den für einige Programmiersprachen vorhandenen Solr-Client-Bibliotheken nutzen.

Für den ersten Kontakt mit Solr empfiehlt es sich, das im Verzeichnis example/exampledocs mitgelieferte Werkzeug SimplePostTool mit java -jar post.jar -h aufzurufen. Mit java -jar post.jar *.xml lädt man alle Beispieldokumente zu Solr hoch, um diese dort zu indizieren.

Solr kann nicht nur Dateien, sondern auch Datenbanken indizieren. Im mitgelieferten Beispiel unter dem Verzeichnis example\example-DIH werden die Entitäten der HSQL-Datenbank in der Datei db-data-config.xml und der SolrEntityProcessor unter der url="http://localhost:8983/solr/db in der
Datei solr-data-config.xml registriert. Nachdem der so konfigurierte Solr-Server mit

java -Dsolr.solr.home="./example-DIH/solr/" -jar start.jar

gestartet ist, lässt sich die Konfiguration mit http://localhost:8983/solr/db/dataimport testen. Die gesamte Datenbank indiziert man mit dem Aufruf von http://localhost:8983/solr/db/dataimport?command=full-import. Der example-DIH-Server kann neben einer Datenbank auch RSS-Feeds oder E-Mails indizieren, wenn diese in der Datei solr.xml mit default="true" freigeschaltet wurden. Die Einstiegs-URLs lässt sich mit http://localhost:8983/solr/ anzeigen. Um einen vorkonfigurieren RSS-Feed von heise Developer zu indizieren, muss der Entwickler http://localhost:8983/solr/rss/dataimport?command=full-import aufrufen.

Selbst für ein Cluster, einen Cache, eine Replikation oder für die Verwendung von Multicores kann Solr konfiguriert werden. Für zwei Kerne lässt sich das fertige Beispiel mit

java -Dsolr.solr.home=multicore -jar start.jar 

starten und auf die gewohnte Weise verwenden.

Standardmäßig kann Solr Dokumente in den Formaten JSON, XML oder CSV indizieren. Um Dokumente in anderen Formaten wie HTML, PDF, XLS und DOC oder in Fremdsprachen zu berücksichtigen, sollte Lucene zusammen mit Apache Tika verwendet werden. Für den Solr-ExtractingRequestHandler und das Sprach-Plug-in nimmt der Entwickler folgende Bibliothekspfade:

  • <lib dir="../../dist/" regex="apache-solr-cell-\d.*\.jar" />,
  • <lib dir="../../contrib/extraction/lib" regex=".*\.jar" />,
  • <lib dir="../../dist/" regex="apache-solr-langid-\d.*\.jar" /> und
  • <lib dir="../../contrib/langid/lib/" regex=".*\.jar" />

in der solrconfig.xml auf. Tika selbst er, wie bei example-DIH, zusätzlich in der Datei tika-data-config.xml konfigurieren.

Wer tiefer in Solr einsteigen möchte, wird mit den Informationen im Solr-Wiki nicht weit kommen. Hier helfen das kostenlose Referenzhandbuch von LucidWorks oder das Buch "Lucene in Action" [1].

Bei Solr 4.0 und Lucene 4.0 ändert sich einiges. Neben einer besseren Verwendung in der Cloud mit Unterstützung für Hadoop und ZooKeeper haben die Entwickler einige APIs und Algorithmen – etwa zur Geospatial-Suche – geändert. LucidWorks stellt außerdem mit LucidWorks Big Data ein auf Solr 4 beruhendes und mit den zusätzlich Produkten Hadoop, Mahout, HBase, ZooKeeper, Kafka, Oozie und Behemoth integriertes Angebot zur Analyse und Verarbeitung großer Textmengen für die Cloud zur Verfügung. Das Paket zeigt, dass Solr weit mehr sein kann als ein reiner Such- und Indizierungsdienst.

Obwohl die meisten Änderungen in Solr und nicht in Lucene stattfinden, wird der Umstieg für Solr-Anwender wohl weniger Auswirkungen haben, da die Kopplung über die REST-Schnittstelle hier geringer ist als bei der direkten Nutzung der Lucene API. Nach der Beschäftigung mit den neuen Solr-Konzepten über eine modernisierte und aufgeräumte Verwaltungsoberfläche kann der Umstieg durch eine einfache Neuindizierung oder einem Upgrade des Index von Lucene 3.x mit

java -cp core\lucene-core-4.0.0.jar org.apache.lucene.index.
IndexUpgrader <indexDir>

erfolgen.