Der Ghost Content API mangelt es derzeit noch an einigen wichtigen Features um effizient Daten abzufragen. Man ist zum Beispiel gezwungen die komplette Tabelle an Datensätze zu laden, weil Out-of-the-box kein LIKE bzw. eine teilweise Übereinstimmung unterstützt wird.
Um den Datenbank Server zu entlasten, könnte man beim Build - Prozess von Gatsby einen Index anlegen und diesen durchsuchen. Das hat gleich mehrere Vorteile. Zum einem wird nur ein einzelner Request an den Server gestellt um die zu durchsuchenden Daten zu laden, es kann vorab definiert werden in welcher Form die Datensätze vorliegen sollen und der Service Worker vom gatsby-plugin-offline kann den Index ohne weiteres lokal speichern und auch precachen.
Setup
Wir wechseln in den Ordner Plugin und erstellen ein neues lokales Plugin.
$ cd plugins
$ gatsby new gatsby-plugin-search https://github.com/gatsbyjs/gatsby-starter-plugin
Module und Funktionen zum bereinigen des Contents
Wir müssen nur die gatsby-node.js unseres Plugins bearbeiten. Zum Anfang kümmern wir uns um den Import von benötigten Node.js Modulen und fügen eine Funktion zum entfernen von Whitespaces und eine die Zeilenumbrüche und Tabulatoren entfernt.
Die Funktion onPostBootstrap
Wir definieren einige Variablen und prüfen ob die benötigten Argumente in Ordnung sind.
Daten für den Index aufbereiten
Der Content wird hier für den Index in das passende Format gebracht und bereinigt.
Die Index-Datei speichern
Nun müssen die Daten nur noch in der Index-Datei gespeichert werden.
Das Plugin laden
Nun muss der Plugin Name plus benötigter Optionen in der Datei gatsby-config.js im plugins Object Array hinzugefügt werden. Da plaintext indiziert wird, können wir den kompletten Inhalt durchsuchen. Wenn die Index - Datei zu groß werden sollte, kann man darauf auch verzichten.
Webworker
Im Webworker Script passen wir die search Funktion wie folgend an.
Die Suche komplett vom Client ausführen zulassen mag in diesen Beispiel keine Probleme bereiten. Jedoch ist das eher die Ausnahme und mit zunehmenden Datensätzen erhöht sich natürlich auch die Datenmenge, die initial geladen werden muss. Den Suchprozess auf einen Server zu verlagern macht also durchaus Sinn und im ersten Teil von Gatsby-Ghost Suche: Redis und RediSearch möchte ich auf eine mögliche Lösung eingehen.