Volltextsuche mit PostgreSQL und Spring (Teil II)
Nachdem wir uns im ersten Teil mit den Grundlagen beschäftigt haben, wollen wir die Volltextsuche nun auch in einer kleinen real-world Application nutzen.
Repository
Die Integration mit Spring Data JPA ist denkbar einfach. Da wir PostgreSQL spezifische SQL Statements verwenden, schreiben wir ein natives Query. Spring Data JPA erzeugt daraus wie gewohnt unsere Objekte.
Wollen wir die Top 10 Ergebnisse, wird das Query etwas umfangreicher, bleibt aber dennoch übersichtlich und die verwendete Technologie bleibt gegenüber unserer Domäne verborgen:
Um damit etwas herumspielen zu können, eignet sich die Beispielanwendung hier im GitHub Repository oder wir schreiben uns schnell ein paar Integrationstests (wie das für jedes gute Softwareprojekt selbstverständlich sein sollte).
Integration Test
Für solche Tests hat sich in der Praxis Testcontainers bewährt.
Wir können hier direkt den passenden PostgreSQL Container nutzen, den uns Testcontainers zur Verfügung stellt. Dadurch müssen wir uns keine Gedanken machen, wie wir die Datenbank im Container richtig konfigurieren und starten. Zudem kann einfach auf die benötigten Variablen zugegriffen werden (z.B. Username, Password und JDBC URL).
Um die entsprechenden Properties für Spring zu setzen, registrieren wir hierfür noch eine eigene PropertySource:
Das ganze lässt sich ganz gut in einer IntegrationTest Klasse kapseln, von der jeder Integrationstest erbt.
Im entsprechenden Test müssen wir dann mit folgender Annotation verhindern, dass unsere Datenbank ersetzt wird (z.B. durch eine H2-InMemory)
Nun können wir in einem kleinen Test schauen, ob unsere Artikel gefunden werden.
Fazit
Schon mit PostgreSQL und Spring Data JPA Bordmitteln ist es vergleichsweise einfach eine Volltextsuche umzusetzen, um flexibel über den Inhalt mehrere Spalten zu suchen. Mit der mächtigen Query Syntax, mit der z.B. auch noch mit unterschiedlichen Gewichtungen gearbeitet werden kann, sind auch komplexe Abfragen möglich. Gerade für kleinere Projekte wird dies oft die wirtschaftlichere Lösung sein und man vermeidet, gleich mit Kanonen auf Spatzen zu schießen.
Alles zusammen findet man hier im GitHub Repository.
Kommentare