Blog der SHI GmbH

Solr 6 Parallel SQL

Wie wir in einem vorherigen Blog über die Neuheiten des nächsten Major Releases von Apache Solr bereits angekündigt hatten, werden in Solr 6 Suchanfragen auf Basis von SQL-Syntax möglich sein. Dieser Beitrag wird detaillierter auf diese Möglichkeit eingehen.

Praktisch alle, die mit Solr in Berührung kommen und vorher mit relationalen Datenbanken gearbeitet haben, stellen sich wohl früher oder später die Frage, ob man nicht SQL-artige Abfragen auch an Solr richtigen kann. Die Antwort auf diese Frage lautet: Man kann – ab Version 6, die in Kürze (Stand 2. März) erscheinen wird. Voraussetzung dieses Features ist eine SolrCloud mit indexierten Daten. Dieses Feature funktioniert also nicht in einer traditionellen Master/Slave-Architektur. Hintergrund dieser Voraussetzung ist, dass diese SQL-Queries auch (oder eigentlich ganz besonders) auf großen Datenmengen funktionieren sollen. Das bedeutet, dass diese Abfragen auch auf verteilten Indexen möglich sind. Man kann sogar noch einen Schritt weitergehen und sagen: Die Aufteilung eines Index auf mehrere Shards ist sogar notwendig, will man größere Datenmengen so durchsuchen bzw. analysieren.

Technisch realisiert ist dies über Facebook’s Presto SQL Parser, Solr’s Streaming API und MapReduce. Ersteres sorgt dafür, dass die SQL-Anfragen geparst werden und ein paralleler Query-Plan erstellt wird. Die Streaming API und MapReduce sorgen dann für die parallele relationale Algebra, die hinter den Kulissen stattfindet, um das Ergebnis zu berechnen. Gerade die Streaming API in Verbindung mit MapReduce sorgen dafür, dass parallele Verarbeitungen komplexer Abfragen auf großen Datenmengen möglich sind.

Für die Nutzung dieses Features ist Solr 6 notwendig, das zum Zeitpunkt dieses Blog-Beitrags noch nicht veröffentlicht ist. Um bereits mit diesem Feature experimentieren zu können, kann man einen der letzten erfolgreichen Solr Builds über diese Seite beziehen.

Die folgenden Beispiele nehmen folgendes als Grundlage an:

  • Solr ab Version 6 läuft im SolrCloud-Modus.
  • Es existiert eine Collection namens techproducts.
  • In dieser Collection sind die Beispieldokumente indexiert (alle unter example/exampledocs befindlichen XML-Dokumente).
  • In der solrconfig.xml sind folgende Handler gemäß Dokumentation (https://cwiki.apache.org/confluence/display/solr/Parallel+SQL+Interface) integriert: /export, /stream, /sql
  • Die Felder popularity und _version_ hat docValues aktiviert.

Alle SQL-Queries können nun an den SQLHandler /sql geschickt werden:

https://localhost:8983/solr/techproducts/sql?stmt=select popularity from techproducts

Anhand dieses Beispiels sieht man, dass die Solr Collection als Tabelle gesehen wird, die Felder als deren Spalte. In diesem einfachen Statement werden nun alle Werte für popularity aus der Collection techproducts extrahiert.

Natürlich sind auch komplexere Anfragen möglich:

https://localhost:8983/solr/techproducts/sql?stmt=select popularity, count(*) from techproducts where popularity = '[4 TO *]' group by popularity order by count(*) desc limit 3

Mit dieser Query kommen die drei am häufigsten vorkommenden popularity-Werte, die größer als vier sind, gruppiert zurück inklusive der Anzahl ihrer Vorkommnisse im Index:

{
  "result-set":{"docs":[
{
  "count(*)":5.0,
  "popularity":6},
{
  "count(*)":4.0,
  "popularity":7},
{
  "count(*)":2.0,
  "popularity":10},
{
  "EOF":true,
  "RESPONSE_TIME":24}]}}

Dieses Beispiel zeigt auch, dass SQL-Queries in der Where Clause mit Solr-Syntax kombiniert werden können. So sind SQL-Queries, die Geodaten berücksichtigen möglich. Solr wandelt sich so von einem Suchmaschinenserver für die Suche innerhalb Volltext immer mehr zu einem Data Store, der nicht nur für bestimmte analytische Zwecke verwendet werden kann, sondern generell für derartige Einsatzzwecke geeignet ist.

Weiterführende Links:

Daniel Wrigley

Daniel Wrigley