Michael Silzle
Michael ist Softwareentwickler und Geschäftsführer von codeunity
16.04.2021 | 5 min Lesezeit
Wer heutzutage das Suchfeld auf einer Website oder die Suchfunktion in einer App verwendet, erwartet instinktiv das Verhalten und die Qualität einer Google-Websuche. In den meisten Fällen wird man dabei jedoch enttäuscht und weicht beispielsweise beim gezielten Suchen von Inhalten auf einer Webseite auf die Google-Suche aus, anstatt sich durch die oftmals überladenen Websites zu navigieren - vor allem auf mobilen Geräten. Wer kennt das nicht? Man ist dann sogar bereit, die aktuell besuchte Website wieder zu verlassen, um sich über die Google-Suche entsprechend zum gewünschten Inhalt auf derselben Webseite führen zu lassen. Auf die Autovervollständigung, welche schon während des Tippens Vorschläge für Suchbegriffe macht, will man nicht mehr verzichten.
Es soll hier jedoch weniger um Google oder die Suche im World Wide Web gehen, denn es gibt außer der Websuche noch viele weitere Anwendungsgebiete, in denen das Suchen nach Informationen relevant ist. Dazu gehört z.B. das Suchen nach Dateien und Ordnern auf einem Laptop oder Smartphone, Informationen in E-Mails oder in Unternehmens-Datenbanken und -anwendungen. Letzteres soll in diesem Blogpost anhand eines Praxisbeispiels beschrieben werden.
Wir als codeunity hatten in einem Kundenprojekt die Anforderung, eine Volltextsuche zu implementieren, die gezielt Knoten/Datensätze in einer Graph Datenbank ausfindig macht. Die Idee war, mit Bordmitteln der zugrunde liegenden Datenbanktechnologie eine möglichst effiziente Volltextsuche zu implementieren, um den minimalen Implementierungsaufwand zu haben. Unsere Erwartungen an die Performance und die Qualität der Suchergebnisse konnten damit jedoch nicht erfüllt werden. Zudem konnten keine Rechtschreibfehler oder Wortvarianzen erkannt werden, was zu schlechten Suchergebnissen geführt hat. Daraufhin entschieden wir uns, einen externen Suchservice anzubinden, der diese Anforderungen besser lösen sollte.
Die Wahl fiel dabei auf Elasticsearch, weil dieses schon in Teilbereichen des Projekts zum Einsatz kam und somit direkt genutzt werden konnte. Zudem ist der Service sehr populär und wirbt mit hoher Kundenzufriedenheit, weshalb wir diesen gerne einmal ausprobieren und einsetzen wollten. Doch was verbirgt sich hinter dem Namen Elasticsearch?
Elasticsearch ist eine kostenlose und offene verteilte Suchmaschine und Analytics-Engine für Daten aller Art – von Textdaten über numerische Daten und Geodaten bis hin zu strukturierten und unstrukturierten Daten. Quelle: elastic
Elasticsearch wird von der Firma elastic entwickelt und vermarktet, welche ein breites Spektrum an Services rund um das Thema Anreichern, Speichern, Analysieren bis hin zum Visualisieren von Daten anbietet. Der Service wurde 2010 eingeführt und basiert auf Apache Lucene. Zum Einsatz kommt Elasticsearch bei der Suche nach Daten in Anwendungen, auf Websites, in Unternehmensdaten oder bei Analysen von Log-Dateien. Dabei ist das System hoch skalierbar und je nach Konfiguration und Hardware extrem performant.
Beim Anbinden und Konfigurieren der Elasticsearch waren wir schnell begeistert. Der Service verbirgt größtenteils die Komplexität, die eine Suche mitbringt und hat eine gute Balance zwischen ausgedehnter Konfigurationsmöglichkeit und einfachem OnBoarding geschaffen. Die bereits bestehende Implementierung unserer bereits erwähnten Datenbanksuche musste dabei verworfen und das Konzept der Ingestion und Datenbereitstellung überarbeitet und neu implementiert werden. Daraufhin wurden alle zu durchsuchenden Informationen in der Elasticsearch und alle technischen Informationen und Abhängigkeiten zwischen den Daten inkl. dem Inhalt der Elasticsearch im Graph hinterlegt. In Elasticsearch wird lediglich ein Read-Model der Informationen aus dem Graph gespeichert, welches darauf optimiert ist, Suchanfragen treffsicher und schnell beantworten zu können. Das Read-Model kann jederzeit aus den Daten des Graphs neu generiert werden.
Der Einstieg war dabei sehr einfach, da es einen fertigen Elasticsearch Docker Container gibt, mit dem man auf dem lokalen Entwicklungssystem oder in der Testumgebung loslegen kann. Zudem kann der Service auch in der Elastic Cloud oder in anderen Cloudservices wie AWS, Micorsoft Azure oder Google Cloud als hosted Service gebucht werden. Elastic hat kürzlich jedoch das Lizenzmodell angepasst (mehr dazu hier), womit nun untersagt ist, den Service als SaaS weiter zu vermarkten. Es ist also noch unklar, wie es dann mit den derzeitigen Cloud-Angeboten weitergeht. Über REST Apis oder die in allen gängigen Programmiersprachen verfügbaren SDKs kann die Suche beliebig konfiguriert, Dokumente hinzugefügt und durchsucht werden. Dabei kann man die Suche frei an die eigenen Bedürfnisse anpassen und festlegen, welcher Teil von Dokumenten relevant für die Suche ist. Des Weiteren kann man beschreiben, wie stark ein Suchbegriff vom Inhalt des Zieldatensatzes abweichen darf, um noch gefunden zu werden (siehe Levenshtein Distanz). Damit lassen sich auch trotz Rechtschreibfehlern oder Wortvarianzen (siehe Stemming) gute Suchergebnisse erzielen. Sollen beispielsweise Inhalte zu dem Wort 'Loßburg' gefunden werden, auch wenn man 'Lossburg' oder nur 'Loosbu' eingibt usw.
Über sogenannte Suggesters kann auch die bereits erwähnte Vorschlagsfunktion im UI umgesetzt werden. Während der Benutzer den Suchbegriff noch eingibt, kann die Elasticsearch schon entsprechend Vorschläge generieren. Es stellt Worte und/oder Sätze aus Suchergebnissen zu dem bereits eingegebenen Suchterm bereit, welche dem Nutzer dann zur Auswahl angeboten werden können.
In diesem Blogpost wurde hauptsächlich über Elasticsearch geschrieben und es könnte der Eindruck entstehen, dass es keine Alternativen gibt. Dem ist aber nicht so, denn es gibt sie! :) Zu nennen ist hier Azure Cognitive Search, welche wir ebenfalls schon eingesetzt haben. Diese unterscheidet sich bei der Anbindung und in der Verwendung nur unwesentlich von Elasticsearch, der Service kann jedoch nicht kostenlos genutzt werden. Google bietet hier ebenfalls unter dem Namen Cloud Search einen bezahlten Hosted Service an. In der Open Source Welt sind zudem bekannte Vertreter Sphinx und Solr von Apache. Letzteres setzt ebenfalls auf Apache Lucene auf.
Wer mit dem Gedanken spielt, eine Suche einzusetzen, macht mit Elasticsearch nichts falsch. In unserem Anwendungsbeispiel konnten wir viele gute Erfahrungen mit dem Service machen und werden diesen auch bei weiteren Projekten einsetzen. Dabei ist unsere Empfehlung für Produktivsysteme, auf die bezahlten Elasticsearch Services der oben genannten Anbieter zurückzugreifen, da man nur schwer eine ähnlich gute Hochverfügbarkeit, Georedundanz und Hardwareleistung bereitstellen kann. Wir freuen uns schon auf weitere Projekte mit Elasticsearch.