Als Internetnutzer*innen wissen wir den enormen Nutzen und Komfort von Internet-Suchmaschinen wie Google, Bing oder DuckDuckGo zu schätzen. Will man auf seiner Webseite eine spezialisierte Suchfunktion anbieten, muss diese auch die Erwartungen der Nutzerinnen und Nutzer erfüllen. Dieser zweiteilige Blogpost gibt im ersten Teil eine Übersicht und einen Einstieg in die Implementierung einer Suche, während der zweite Teil einzelne Themen vertieft.
Möchte man auf seiner Webseite eine spezialisierte Suchfunktion anbieten (z.B. die Suche nach Adressen), muss diese präzise und schnell sein. Werden die hohen Erwartungen der Nutzerinnen und Nutzer nicht erfüllt, wirkt eine Seite schnell veraltet. Heute gibt es leistungsfähige, einfach handhabbare Search-Engines, welche sich mit wenig Aufwand auf alle Arten von Daten, insbesondere auch räumliche, anwenden lassen.
Eine Search-Engine sollte einerseits die grundsätzlichen Anforderungen der Nutzerinnen und Nutzer an eine Suche erfüllen, andererseits problemlos in die bestehende Architektur eingebettet werden können. Es soll einfach möglich sein, die vorhandenen Daten nach unterschiedlichen Attributen zu durchsuchen. Im Falle eines WebGIS gehören dazu zum Beispiel Namen, Adressen, Nummern oder Koordinaten, wobei Tippfehler trotzdem zu relevanten Suchresultaten führen sollten (Fuzzy-Search). Das gewählte Suchergebnis soll direkt auf der Karte im WebGIS ersichtlich werden. Die Suche ist im Idealfall zudem performant, möglichst flexibel erweiterbar und lässt sich in beliebige Applikationen einbinden.
Evaluation
Für die Integration einer Suche in ein WebGIS gibt es unterschiedliche Möglichkeiten, bekannt sind u.a. die zwei Open Source Search-Engines Elasticsearch und Solr (beide basierend auf der Technologie Apache Lucene). Insbesondere die Search-Engine Elasticsearch eignet sich als gute Lösungsvariante:
- Die aus Nutzerinnen- und Nutzersicht relevanten Anforderungen an eine Suche für ein WebGIS werden abgedeckt.
- Durch die Konfiguration eines Suchindexes lässt sich die Suche einfach erstellen und anpassen. Der entstehende Initialaufwand durch den Aufbau des Indexes wird durch die Leichtfüssigkeit beim Unterhalt und bei Erweiterungen ausgeglichen.
- Weitere Attribute oder zugehörige Dokumente können zur Suche hinzugefügt werden.
- Die Search-Engine ist auf die Suchfunktionalitäten hin optimiert und entsprechend performant. Sie weist eine hohe Zuverlässigkeit auf.
- Die Integration in eine bestehende Infrastruktur ist problemlos möglich. Der modulare Aufbau erlaubt eine einfache Einbindung weiterer Suchdienste.
Architektur
Architektonisch umsetzen lässt sich die Integration des Suchdienstes beispielsweise wie nachfolgend anhand einer Suche für AV-Daten (Daten der amtlichen Vermessung) beschrieben. Die Lösung umfasst eine PostgreSQL-Datenbank der AV-Daten und eine einzelne Elasticsearch-Instanz. Für die fertige Suche muss lediglich der Datenimport und der Suchdienst selbst entwickelt werden. Das Komponentendiagramm sieht folgendermassen aus:
- Die AV-Daten sind in einer PostgreSQL-Datenbank abgelegt und dienen als Quelldaten für die Suche.
- Der Datenimport ist ein Python-Skript, welches die Strassen, Adressen, EGRIDs, etc. inklusive Geometrien aus PostgreSQL abruft und Elasticsearch hinzufügt. Der Import wird periodisch oder bei Bedarf ausgeführt.
- Elasticsearch ist eine schema-less, horizontal skalierbare Document-Database, welche die importierten Daten als Suchindizes abspeichert und Suchabfragen durchführt. Elasticsearch ist als Open Source-Software oder mit einer Enterprise-Lizenz erhältlich. Man kann sie entweder selbst betreiben oder als Managed-Service einkaufen. Self-hosting ist eine gute Option insbesondere für kleine Datenmengen (<10GB) und wenn sich die Suchindizes in kurzer Zeit neu aufbauen lassen.
- Der Suchdienst ist eine Python REST-API, welche die Suchabfrage auf Elasticsearch kapselt und eine kompatible Schnittstelle für ein WebGIS anbietet. Die Kapselung von Elasticsearch ist grundsätzlich aus Sicherheitsgründen erforderlich, damit es für Dritte nicht möglich ist, aufwendige Suchen zu starten oder alle Daten einfach so herunterzuladen.
Daten importieren und indexieren
Bevor Daten importiert werden können, muss der Suchindex in Elasticsearch konfiguriert werden. Konkret geht es dabei um Mappings sowie Analyzers und Tokenizers, welche definieren, wie die Daten für die Suche aufbereitet werden. Je nach Anforderungen und Daten können die Analyzer unterschiedlich komplex aufgebaut werden. Beispielsweise möchte man für Adressen eine Suche über mehrere Felder inkl. Autocompletion und Fuzzy-Search ermöglichen.
Um die Suchergebnisse zu verbessern, einzelne Felder oder exakte Treffer einzelner Felder stärker zu gewichten, kann es sinnvoll sein, das gleiche Feld mehrmals und auf verschiedene Arten zu indexieren.
Suchabfrage
Die eigentlichen Suchen werden in einem Python-Skript des Suchdienstes definiert: Es wird einerseits ausgewählt, welcher Index durchsucht werden soll, andererseits werden die Felder angegeben, in denen gesucht werden soll. Die Definitionen können sehr simpel sein (z.B. eine Match query, mit der nach einer exakter Übereinstimmung gesucht wird) oder auch etwas komplexer werden (z.B. eine Multi-match query über mehrere Felder).
Zusätzlich können verschiedene Typen definiert werden, was einen Einfluss auf die Gewichtung hat oder eine Filterung erlaubt. Die gefundenen Resultate können schliesslich sortiert werden: dies ist einerseits über den Score möglich, andererseits auch über Inhalte von Feldern, z.B. von Hausnummern.
Wir haben eine solche Suche kürzlich z.B. für den Kanton Zug konzipiert und für einen ausgewählten Teil des vorhandenen Datensatzes implementiert.
Fazit
Bei einer Webseite mit vielen Daten verbessert eine gute Suche das Benutzererlebnis enorm. Elasticsearch bietet hierzu mit seinen Datenstrukturen und Suchalgorithmen eine ideale Ausgangslage. Die Konfiguration von Elasticsearch ist einfach anpassbar auf neue Use-Cases, und man hat die volle Kontrolle, wie die Ergebnisse gewichtet werden.
Im Teil 2 zum Thema Suchdienst werden wir die technischen Details zur Suchoptimierung und zur Entwicklung des Datenimports und Suchdienstes erläutern.
Beitrag von Elio Gubser und Anne Wegmann
Entdecke mehr von digital.ebp.ch
Subscribe to get the latest posts sent to your email.