Diese Woche ist Apache Solr 4.9 veröffentlicht worden. Neben vielen Bug-Fixes und Verbesserungen gab es auch einige neue Funktionalitäten. Eine von den hervorstechenden Neuerungen ist die AnalyticsQuery API, die ich in diesem Blog kurz vorstellen werde.
Was ist die AnalyticsQuery API und wie funktioniert sie?
Die AnalyticsQuery ist im Grunde genommen eine Erweiterung bzw. Abstrahierung der bestehenden Filter (PostFilter) Implementierungen mit dem Ziel eigene „Filter“, „Aggregationen“ oder „Auswertungen“ entwickeln zu können.
Im Ablauf einer Suche – von Volltext-Suche über Facettierung, Highlighting etc. bis hin zur Auslieferung des Ergebnisses, ist die AnalyticsQuery nach der Volltext-Suche angesiedelt. Somit steht der AnalyticsQuery das Suchergebnis – alle relevanten Dokumente, nicht nur die ersten 10 Treffer – zur Verfügung. Dies gilt natürlich auch für die verteilte Suche über mehrere Shards hinweg, denn die einzelnen Solr Responses können in der AnalyticsQuery gemerged werden.
Die AnalyticsQuery arbeitet also mit einem eingeschränkten Dokumentenbestand. Dieser Umstand lässt sich wunderbar nutzen, da so ein Teil der eigenen Anforderungen an die Analysefunktionalität bereits durch reine Suche umgesetzt werden kann. Möchte man beispielsweise die durchschnittlichen Preise je Kategorie eines bestimmten Herstellers ermitteln, kann man die Einschränkung auf die Hersteller durch Suche erreichen und die Berechnung der durchschnittlichen Preise je Kategorie implementiert man mittels AnalyticsQuery.
Mehrere solcher AnalyticsQueries können nacheinander ausgeführt werden. Dies erhöht die Flexibilität bei der Nutzung der Funktionalität und reduziert die Komplexität der Implementierung, da diese sogar aufeinander aufbauen können. Während der Suche erreicht man dieses Verketten der AnalyticsQuery über den cost-Faktor, den man bereits von den FilterQueries (PostFilter) kennt. Je höher dieser cost-Faktor, desto „später“ wird die AnalyticsQuery ausgeführt.
Was muss ich machen um eigene AnalyticsQueries einsetzen zu können?
Um die AnalyticsQuery nutzen zu können, muss man diese erst einmal entwickeln. Ich werde im Rahmen dieses Blogs nicht zu tief in die Technik einsteigen, sondern nur den groben Ablauf beschreiben.
Der erste Schritt bei der Implementierung ist das Ableiten der Klasse AnalyticsQuery. Es gibt hier zwei Constructors, die implementiert werden müssen bzw. können. Der eine Constructor ist für die Nutzung innerhalb einer einzelnen Solr Instanz und der zweite ist für die Nutzung innerhalb einer SolrCloud (verteilte Suche).
Der zweite Schritt ist die Implementierung der Logik für die AnalyticsQuery. Hierfür gibt es die Methode getAnalyticsCollector, die ebenfalls überschrieben werden muss. In dieser Methode hat man vollen Zugriff auf das Suchergebnis und den Index und kann somit auf alle notwendigen Informationen zugreifen um eigene Berechnungen zu entwickeln.
Neben der Logik für das Erstellen der eigenen Auswertungen wird in dieser Methode auch der Solr Response erweitert, so dass man später mit dem Client auf die Ergebnisse zugreifen kann.
AnalyticsQuery in Apache Solr
Sobald man eine eigene Implementierung der AnalyticsQuery programmiert und das JAR-File an eine der üblichen Stellen abgelegt hat, kann man diese AnalyticsQuery in Solr nutzen.
Hierfür wird die LocalParams-Syntax genutzt. Der folgende Solr Request ist ein Beispiel für einen solchen Aufruf
q=manufacturer::XYZ&fq={!calcAvgPrice param1=priceField param2=catField}
Im obigen Beispiel wird mit der Syntax „!calcAvgPrice“ die AnalyticsQuery aufgerufen, die den durchschnittlichen Preis ermittelt. Mit den Parametern kann konfiguriert werden, auf welchen Feldern die Berechnung basieren soll. Zusätzlich wird die Berechnung auf alle Hersteller mit den Namen XYZ eingeschränkt (siehe q).
Fertig ist die erste einfache Auswertung! Den Durchschnittspreis zu berechnen, ist zugegebener Maßen nicht herausfordernd und lässt sich bereits in den vergangenen Solr Versionen umsetzten. Ich glaube aber, dass dieses einfache Beispiel die AnalyticsQuery gut demonstriert.
Fazit
Die neue AnalyticsQuery API bietet einen leichten Einstieg, um in seinem Datenbestand analytische Auswertungen und Aggregationen durchführen zu können. Dabei kann man auf alle Ressourcen und Features von Apache Solr, wie beispielsweise Skalierung in der SolrCloud, zurückgreifen und profitiert doppelt.
Es gibt hier jedoch noch keine OUT-OF-THE-BOX Funktionalitäten, daher muss man aktuell eigenen Code entwickeln. Das liegt zum einem am Umstand, dass viele analytische Auswertungen sehr speziell sind und man dafür schwer allgemeingültigen Code schreiben kann. Zum anderen ist die Funktionalität ja noch recht neu. Ich bin mir sicher, dass sich dieser Umstand schnell ändern wird und freue mich schon, selber eigene Module zu implementieren.
Weiterführende Links
- Jira Issue – https://issues.apache.org/jira/browse/SOLR-6150