Blog der SHI GmbH

Apache Solr goes JSON

Liest man die einschlägigen Dokumentationen zu Apache Solr, wird man immer wieder auf das sogenannte Solr XML stoßen. Mit diesem speziellen XML Format kann der Index leicht manipuliert werden. Viel mehr geht damit aber auch nicht. Seit einigen Versionen gibt es in Solr eine JSON API mit der man ebenfalls den Index manipulieren, aber auch suchen kann.
In diesem Blog werde ich diese API kurz vorstellen und die Möglichkeiten mit den traditionellen Möglichkeiten vergleichen.

JSON Request API

Die neue JSON API erlaubt jede Art von Requests auszuführen, die man sich bei Solr vorstellen kann, d.h. sowohl Indexierungs-Requests, als auch Such- oder Admin-Requests können diese API nutzen.
Um nah an der Solr Dokumentation zu bleiben, werde ich ebenfalls alle nachfolgenden Beispiele anhand eines CURL Aufrufes (Windows CMD) demonstrieren. Selbstverständlich kann man das auch direkt im Browser ausführen und das JSON mittels „stream.body“ übertragen. Alternativ kann man dies auch in der Solr Admin Oberfläche machen; siehe Screenshot.

Solr bietet eine Vielzahl an Möglichkeiten, wie man indexiert. Lassen wir die Möglichkeiten wie DataImportHandler oder CELL außen vor ist der einfachste Weg die bereits erwähnte Solr XML Notation. Das folgende Beispiel zeigt, wie man auf diesem Weg Dokumente indexieren kann:

curl "https://localhost:8983/solr/collection/update" -H "Content-Type: text/xml" -d
"<add>
   <doc>
      <field name="id">xml_doc</field>
      <field name="authors">Markus Klose</field>
      <field name="subject">Solr goes JSON</field>
   </doc>
</add>"

Die JSON API bietet einen speziellen RequestHandler (/update/json/docs) für die Indexierung. Somit sieht der Indexierungs-Request in JSON Syntax wie folgt aus.

curl "https://localhost:8983/solr/collection/update/json/docs" -H "Content-Type: application/json" -d
"{
  "id" : "json_doc",
  "auhtors" : "Markus Klose",
"title" : "Solr goes JSON"
}"

Beide Varianten sind aus meiner Sicht hier mehr oder minder identisch.
Bei der Suche werden im traditionellen Verfahren alle benötigten Parameter als Request Parameter angehängt. Dies ist kein Problem, wie das folgende Beispiel zeigt.

curl -X GET "https://localhost:8983/solr/collection/select?q=memory&fq=inStock:true"

Jedoch wenn die Anzahl der Parameter wächst wird die URL immer länger und wird schwer lesbar wenn man einmal die Suchanfrage debuggen muss.
Mit der JSON API können die Parameter weiterhin als Request Parameter an Solr übermittelt werden. Es ist aber auch möglich die Parameter innerhalb des JSON Objektes mit zu übergeben. Dabei gibt es einige Namensänderungen. Beispielsweise wird der Parameter q zu query im JSON.

curl "https://localhost:8983/solr/collection/select" -d
"{
   "query":"memory",
   "filter":"inStock:true"
}"

Vor allem bei langen, verschachtelten Suchanfragen lohnt die JSON Syntax, da man durch die Zeilenumbrüche eine bessere Lesbarkeit erreicht.
Es sind natürlich nicht nur „einfache“ Suchen mit der JSON API umsetzbar. Es können selbstverständlich auch alle anderen Features, wie Facettierung, Highlighting, Meinten Sie etc. umgesetzt werden. Teilweise sogar besser, als mit der herkömmlichen Variante. Dies wird besonderes bei der Facetten-Suche deutlich. Es lassen sich hier beispielsweise Sub-Facetten erzeugen, wodurch flexiblere Pivot Facetten möglich werden.

Performance Auswirkungen

Die JSON API ist aber nicht nur eine formale Sache. Da sie von Grund auf neu konzipiert worden ist bringt sie neben mehr Funktionalität auch eine bessere Performance mit. Auch dies wird vor allem bei der Verwendung von Facetten deutlich. Yonik Seeley hat hierzu einige Performance Tests durchgeführt und die Ergebnisse in seinem Blog (siehe Weiterführende Links) veröffentlicht.
Grundsätzlich hat er in einem mittelgroßen Index sowohl die „klassische“ Facettierung, als auch die Facettierung mittels JSON API gegenüber gestellt. Auch wenn sein SetUp recht statisch ist, d.h. es gibt keine Such- bzw. Indexierungs-Requests zur Testzeit, ist erkennbar, dass die Facettierung mittels JSON API performanter ist. In seinen Tests war die Antwortzeit der klassischen Facette etwa 3 bis 4-fach höher gegenüber der Facette mit der JSON API.

Fazit

Auf den ersten Blick ist die JSON API nur eine andere Art, wie ich Parameter an den Solr schicken kann. Jedoch auf den zweiten Blick ist sie viel mehr. Mit Ihren zusätzlichen Möglichkeiten und der besseren Performance ist sie auf dem Weg zum Standard zu werden. Ein Wermutstropfen bleibt allerdings. Die JSON API aus JAVA heraus zu nutzen ist noch nicht nativ möglich.

Weiterführende Links

Markus Klose