Seit dem Launch der Beta-Phase hat unsere API nun mehrere Millionen Requests beantwortet. Wir haben spannende Projekte gesehen und viel konstruktives Feedback erhalten. Ein öffentliches Bugtracking und der neue Twitterchannel @zeitonline_dev waren die ersten Schritte, dieses Potenzial zu nutzen. Nun möchten wir interessierten Entwicklern einen Einblick in unsere Schnittstelle geben. Alle Sourcen der API sind ab sofort auf Github verfügbar. Die Architektur erläutern wir hier kurz.
Vom CMS zur API zur App
Der Publikationsprozess unseres Content Management Systems stößt eine Reihe von Aktionen an, die den Artikel auf unterschiedlichen Kanälen verfügbar machen. Für die API werden die Rohdaten des Artikels mit XSL transformiert und via HTTP an den API-Suchserver gesendet. Dies realisieren wir mit Solr, einem Projekt der Apache Foundation. Solr basiert zum größten Teil auf Lucene Bibliotheken und bietet mächtige Features zur Volltextsuche über große Datenmengen. Auch in anderen Bereichen von ZEIT ONLINE wird mit Solr-Technologie gearbeitet, so dass die Wahl für das API-Projekt nahe lag. Die API benutzt für Suchanfragen den ExtendedDisMax Query Parser von Solr. Dieser ist bezüglich der Syntax sehr fehlertolerant und gut geeignet, Benutzereingaben direkt zu verarbeiten. Er unterstützt die volle Suchsyntax und kann spezifische Queries mit boolschen Verknüpfungen, Feldselektoren oder Zeitspannen verarbeiten.
Die sogenannte Facettierung ist ein weiteres Feature von Solr, das für Gruppierung und Quantifizierung von Inhalten nützlich ist. Eine Facette eines Feldes zeigt an, welcher Wertebereich innerhalb der Suchanfrage vorkommt und wie oft ein Wert vertreten ist. Eine Facette ist also eine Untermenge der eigentlichen Query.
Solr bildet keine Relationen zwischen Elementen ab. Deshalb haben wir uns für eine Hybrid-Lösung entschieden: Der Suchserver indexiert Artikeltexte und konstante IDs der zugehörigen Metadaten-Objekte. Die Metadaten-Objekte selbst werden in einer relationalen Datenbank unter der entsprechenden ID als Schlüssel gespeichert. Dies ist zum Beispiel die Kategorie und lexikalische Schreibweise eines Schlagworts. Durch diese Trennung können globale Änderungen an Metadaten durchgeführt werden, ohne dass alle betroffenen Artikel neu indexiert werden müssen.
Ein HTTP-Request an die API wird von einer Middleware auf Basis des Web Frameworks Flask beantwortet. Die Parameter und deren Werte werden auf Gültigkeit überprüft und der angegebene API-Key verifiziert. War die Anfrage valide, muss sie zunächst für den Solr übersetzt werden, da dessen REST-Interface leicht von dem unserer API abweicht.
Die Maskierung und Reduktion der umfangreichen Möglichkeiten von Solr soll die Bedienung der API vereinfachen und ist dem Datenschema angepasst. Als Ausgabeformat setzen wir auf JSON. Es ist schemafrei, wird von den meisten Sprachen und Plattformen unterstützt und ist auch in Rohform noch gut lesbar.
Happy Developing
Wir freuen uns über jeden Fork, jeden Pull-Request und auf einen regen Austausch. Unser Code unterliegt der BSD-Lizenz, da diese Entwicklern alle Freiheiten gibt, Code zu verändern und zu redistribuieren. Über einen kurzen Hinweis, wo und wie unser API-Code zum Einsatz kommt, würden wir uns freuen.
Wir werden unsere API selbstverständlich weiter verbessern. Auch Bugreports und Featurerequests sind weiterhin willkommen.
Links zum Thema