Hibernate Search: Volltextsuche in Spring-Boot-Projekten mit Apache Lucene
Mit Hibernate Search lässt sich das Datenmodell von Spring-Boot-Anwendungen mit Annotationen und ohne Server einfach um eine Volltext-Suchfunktion erweitern.
- Bernhard Jungwirth
Die einfache Auffindbarkeit von Daten wird immer wichtiger. Anwender nutzen eine Suche in Onlineshops oder im Betriebssystem zum Auffinden von Dateien, Apps oder Einstellungen. All diese Suchfunktionen arbeiten mit einem Suchindex, dessen Verwaltung und Aktualisierung im Hintergrund geschieht. Dadurch ist es möglich, priorisierte Suchvorschläge oder eine Klassifikation der Treffer anzuzeigen, um die Suche weiter zu verfeinern.
Von diesen Vorteilen können auch eigene Softwareprojekte profitieren und Benutzern die gewohnte Funktionalität anbieten. Je nachdem, welche Datenmenge zu verarbeiten ist, ist es möglich, die Programmbibliothek zur Volltextsuche direkt zu integrieren oder den Index an einen Elasticsearch-Server auszulagern.
Hibernate: ein quelloffenes ORM-Framework
Relationale Datenbanken sind noch immer eine zentrale Komponente in modernen IT-Systemen. Objektorientierte Programmiersprachen wie Java verwenden Object-Relational Mapper (ORM), um das Datenmodell der Klassen des Programmcodes in Tabellen der Datenbank zu erstellen. Anwendungen im Java-Framework Spring Boot verwenden als Standardimplementierung von ORM Hibernate. Hibernate ist ein Open Source ORM-Framework, das in Java implementiert ist und von Red Hat gesponsert wird. Spring Boot vereinfacht die Entwicklung von Webanwendungen mit Java dadurch, dass eine Konfiguration per Konvention bereits vorgegeben ist. Von Hibernate gibt es neben dem bekannten ORM-Projekt noch weitere Teilprojekte, darunter Hibernate Search.
Dieses Projekt erstellt automatisch einen Suchindex zu den Daten, die Hibernate ORM verwaltet. Hibernate Search speichert den Suchindex direkt mit Apache Lucene oder mit dem Suchserver Elasticsearch. Ersteres ist eine Programmbibliothek zur Volltextsuche und ebenfalls Open Source. Elasticsearch ist ein eigener Suchserver und verwendet als Basis wiederum Apache Lucene. Die Anforderungen der HochverfĂĽgbarkeit und Lastverteilung erfordern den Einsatz von Elasticsearch als eigenem Suchserver. Sind diese Anforderungen nicht erfĂĽllt, genĂĽgt die Programmbibliothek Apache Lucene. Das Beispielprojekt stellt die Verwendung dieser Bibliothek mit Hibernate Search vor. Hier ist es von Vorteil, dass keine eigene Infrastruktur zu betreiben ist.
Neuerungen in Hibernate Search 6
Die Version 6.0 von Hibernate Search ist im Dezember 2020 erschienen und umfasst viele Neuerungen. Bis zur Version 5 war Apache Lucene fester Bestandteil von Hibernate Search, aber mit Version 6.0 ist die API überarbeitet und die Such-Backends sind abstrahiert. Somit können Entwickler Apache Lucene und Elasticsearch gleichwertig verwenden und Aktualisierungen schneller einbinden. Zurzeit ist die aktuelle Version 8.7 von Apache Lucene in den Abhängigkeiten referenziert, und der Suchserver Elasicsearch lässt sich in den Versionen 5.6, 6.8 oder 7.10 anbinden.
Durch die Abstrahierung der Such-Backends ist auch die Search-DSL (Domain Specific Language) neu entwickelt, da sie ebenfalls auf Apache-Lucene-Abfragen aufbaute. Diese Abfragesprache ist nun typsicher, aussagekräftiger und sie umfasst auch Lambda-Ausdrücke. Weitere Details finden sich im Blog von Hibernate in der Release-Meldung zu Hibernate 6.0. Für die Umstellung eines Projekts von Hibernate Search 5 auf Version 6 gibt es einen eigenen Migrationsleitfaden, da durch die vielen Änderungen beim Versionswechsel einiges anzupassen ist.