Apache Solr
Auf Lucene basierende „Such-Engine“ mit Highlevel-Programmierschnittstellen zur Bereitstellung von Enterprise-Suchfunktionalität.
Überblick
In Zeiten des Internet mit seinen leistungsfähigen Suchmaschinen erscheint leistungsfähige (Volltext)-Suchtechnologie fast wie eine Selbstverständlichkeit. Entwickler von Applikationen mit Volltextsuchfunktionen wollen letztere aber nicht unbedingt selbst implementieren, sondern auf fertige Module zurückgreifen.
Hier setzt Lucene an, eine leistungsfähige Suchmaschine aus dem Apache-Projekt, welche sich auf die Bereitstellung der Kernfunktionalitäten konzentriert. Lucene wird in sehr vielen Applikationen - wie z.B. Wikipedia oder auch IBM OmniFind Yahoo! Edition - und Umfeldern eingesetzt, ist dabei aber nicht unbedingt in jedem Fall komfortabel durch den Entwickler zu integrieren. In diese Lücke stößt Solr, ein weiteres Apache-Projekt, basierend auf eben dessen OpenSource-Lizenz.
Such-Technologie
Während es von den Entwicklern relativ vollmundig als „Enterprise Search Server“ bezeichnet wird, handelt es sich doch im wesentlichen um ein Bundle aus Lucene im Kern mit Erweiterungen um Eingabe- und Ausgabe-Schnittstellen.
Wer dahinter ein vollständiges, sofort einsetzbares Produkt für die Realisierung unternehmensinterner Suche vermutet, wird enttäuscht: Es fehlt vor allem ein Crawler, der die Daten und Dokumente einsammelt und den Indexierer füttert. Aber die Zielsetzung ist auch eine völlig andere: Entwickler von Applikationen für Unternehmenssuche finden Highlevel-APIs vor, um sehr flexibel eigene Anwendungen zu entwickeln bzw. die Apache-Suchtechnik rund um Lucene um Suchfunktionen zu ergänzen. Wer ein eher vollständiges Produkt sucht, wird evtl. bei Nutch fündig, einem weiteren Lucene-Subprojekt.
Solar verarbeitet im wesentlichen XML-Daten. Über eine HTTP-Schnittstelle können Dokumente zum Index hinzugefügt werden, über eine ebensolche Schnittstelle kann gesucht und Suchergebnismengen als XML/XSLT-Output ausgelesen werden.
Solr besteht im wesentlichen aus diesen Komponenten:
- Lucene-Kern
- API für Indexierung (Hinzufügen, Ändern, Löschen von Dokumenten)
- API für Suchanfragen mit Ausgabe in XML/XSLT
- Plugin-API zur Erweiterung der Suchfunktionalität
- XML-basierende Konfiguration
- (simple) Administrationsoberfläche
- Monitoring, Logging von Indexierungs- und Suchvorgängen
- Replikationsmechanismus für den Aufbau verteilter Indizes im Master-/Slave-Prinzip („Collection Distribution“)
- vorgefertigte Klassenmodule in verschiedenen Sprachen (Perl, PHP, Java, Ruby usw.) für direkte Nutzung der Solr-Funktionen in diversen Programmierumgebungen
Betriebsgrundlagen
Die technischen Voraussetzungen sind relativ gering: Java 5, eine Solr-Distribution sowie ein Servlet-Container wie Tomcat, JBoss, Jetty oder ähnlich. Solr kann dann als .war-Datei eingerichtet werden und ist sehr schnell betriebsbereit. Wer sich die Installation eines Servletcontainers ersparen und Solr nur ausprobieren möchte, findet ein mit Jetty vorinstallierte Beispieldistribution vor, die direkt gestartet werden kann.
Dokumente hinein ...
Solr stellt eine einfach zu bedienende Schnittstelle für das Füttern des Index bereit. Als Eingabedaten wird XML und alternativ CSV sowie auch eine Reihe von Binärformten - DOC, PPT, XLS, PDF - akzeptiert. Die Übergabe erfolgt mittels HTTP-POST Request und kann somit auf einfachste Weise bewerkstelligt werden, z.B. mittels CURL von der Kommandozeile oder aus einem Script heraus. Alternativ lassen sich diverse externe Crawler aufsetzen, um den Index über die definierten Schnittstellen zu füttern.
Solr verarbeitet diverse Metainformationen, die über ein erweiterbares XML-Schema definiert sind und Beschreibungen von Feldern, Datentypen sowie Indexierungsinformationen enthalten.
Beispiel für ein Eingabe-XML-Dokument (Artikelinformationen):
<add> <doc> <field name="id">F8V7067-APL-KIT</field> <field name="name">Belkin Mobile Power Cord for iPod w/ Dock</field> <field name="manu">Belkin</field> <field name="cat">electronics</field> <field name="cat">connector</field> <field name="features">car power adapter, white</field> <field name="weight">4</field> <field name="price">19.95</field> <field name="popularity">1</field> <field name="inStock">false</field> </doc> <doc> <field name="id">IW-02</field> <field name="name">iPod & iPod Mini USB 2.0 Cable</field> <field name="manu">Belkin</field> <field name="cat">electronics</field> <field name="cat">connector</field> <field name="features">car power adapter for iPod, white</field> <field name="weight">2</field> <field name="price">11.50</field> <field name="popularity">1</field> <field name="inStock">false</field> </doc> </add>
Ein solches Dokument wird dann mittels eines einfachen Update- und Commit-Befehls dem Index hinzugefügt - hier ein Beispiel mit CURL:
curl http://<hostname>:<port>/update -H "Content-Type: text/xml" --data-binary '/<add allowDups="false" overwriteCommitted="true" overwritePending="true"> <doc boost="2.5"> <...DOKUMENTINHALTE...> </doc> </add>' curl http://<hostname>:<port>/update -H "Content-Type: text/xml" --data-binary '<commit waitFlush="false" waitSearcher="false"/>'
... und Daten heraus...
Ist der Index einmal befüllt, lassen sich die mächtigen Suchfunktionen über die konfigurierbare und durch Plugins erweiterbare Query-Schnittstelle nutzen.
Über einfache HTTP-Get Kommandos läßt sich der Index durchsuchen. Dabei kann ein RequestHandler definiert und vorgegeben werden, um unterschiedliche Such- und Ausgabeverhalten zu erreichen. Bei der Suche selbst kann flexibel die Ausgabemenge - z.B. welche Felder zurückgegeben werden sollen - bestimmt werden sowie auch das gewünschte Highlighting von Suchanfragen innerhalb der Ausgabe. Als Suchparameter stehen sämtliche Lucene-Funktionen zur Verfügung.
Für die Aufbereitung der Trefferliste stehen diverse ResponseWriters zur Verfügung, die wiederum selbst definierbar sind. Dabei werden unterschiedliche Datenformate unterstützt: XML, Python, Ruby und andere. Besonders erwähnenswert ist hier die Ausgabe im JSON-Format, da diese verwendet werden kann, um eine Ausgabe in einer AJAX-basierten Applikation bereitzustellen.
Beispiel für eine Suchanfrage, die nur die Felder 'id' und 'name' anfordert:
http://yourhost.tld:9999/solr/select?q=id:SP2514N&version=2.1&indent=1&fl=id+name
Die XML-Ausgabe dazu:
<?xml version="1.0" encoding="UTF-8"?> <response> <responseHeader><status>0</status><QTime>2</QTime></responseHeader> <result numFound="1" start="0"> <doc> <str name="id">SP2514N</str> <str name="name">Samsung SpinPoint P120 SP2514N - hard drive - 250 GB - ATA-133</str> </doc> </result> </response>
Weitere Solr-Stichworte
- Ranking und Relevanz
- Faceting
- Caching
- Plugins
- Performance
- Security
Fazit
Solr bietet Entwicklern auf Basis von Standard-Webtechnologien und XML-Daten eine sehr mächtige und dabei sehr einfach zu integrierende und benutzende Suchengine. Solr setzt dabei konsequent auf Konfigurierbarkeit und Erweiterbarkeit und flexible Verwendung von Daten im wesentlichen auf Basis von XML. Die offene Schnittstellen bietet dabei einfache und gleichzeitige effektive Mittel, um diese Suchtechnologie in Applikationen zu integrieren sowie Datenhaltungssysteme zu erschließen.
Siehe auch
Weblinks
— Autor des Beitrags: Andrej Radonic 6.9.2007, 17:27

