Umkreissuche mit Lucene

12_2011
In einem aktuellen Projekt haben wir eine Suche nach freien Pflegeplätzen in Hamburg und dem angrenzenden Umland umgesetzt.
Das Konzept sah eine Umkreissuche vor. Das Budget verlangte, dass die Suche sich mit wenig Aufwand realisieren lassen sollte.

Die Aufgabe

Im Interface für die Suche wählen die User entweder einen Ort auf einer Karte aus oder sie geben eine Adresse postalisch als Strasse und Ort ein. Anschliessend entscheiden sie sich für einen Radius. Als Ergebnis werden alle freien Pflegeplätze angezeigt, die sich im gewählten Umkreis befinden.

Für diese Anwendung ist es nicht wichtig, dass die Ergebnisse sich *exakt* im gewählten Radius befinden. Der Umkreis stellt nur eine Annäherung dar; ob sich ein Objekt im 5 km-Radius oder im 6,75 km-Radius befindet, ist für den Nutzen der Suche unerheblich.

Daher können wir – anstatt die Objekte auf einen Kreis einzuschränken – einen Bounding-Box-Ansatz benutzen, der alle Objekte  findet, die innerhalb eines Rechtecks liegen. Bounding Box ist algorithmisch einfacher als das Einschränken auf einen exakten Radius. Wenn die Ergebnisse wieder auf einer Karte dargestellt werden, ist der Bounding-Box-Ansatz für die User auch nützlicher, weil im Ergebnis alle Objekte enthalten sind, die sich im jeweiligen Kartenausschnitt finden.

Lucene oder relationale Datenbank

Da wir die Pflegeheime nicht als Objekte in einer relationalen Datenbank vorliegen haben (sie werden als generische Content-Objekte im CMS gespeichert) und die gesamte Suche im Projekt mit Lucene implementiert wurde, haben wir uns dafür entschieden, auch für die Umkreissuche Lucene einzusetzen.

Berechnung

Aus der Wikipedia haben wir entnommen, dass zwei Breitengrade immer einen Abstand von 111 km haben, während der Abstand der Längengrade mit der geographischen Breite variiert. Am Äquator ist der Abstand zwischen den Längengraden am größten, am Pol laufen sie in einem Punkt zusammen.
Für Deutschland gilt, dass die Abstände der Längengrade zwischen etwa 75 km ganz im Süden und 64 km ganz im Norden laufen. Wir nehmen für Hamburg und Umgebung daher näherungsweise 66 km pro Längengrad an.

Die Adressen der Pflegeheime liegen nur postalisch vor. Für die Umkreissuche haben wir uns mit Hilfe der Google-Geocoding-API[1] die entsprechenden Koordinaten besorgt und sie im Lucene-Index gespeichert.

Die Eingabe der User überführen wir ebenfalls mit dem Google Geocoder in Koordinaten. Für die Suche nach Objekten in der Nähe ist dann nur noch das Bestimmen der Rechteck-Grenzen und eine einfache Range-Search in Lucene nötig:


left = center_lng - 1/66 * radius
right = center_lng + 1/66 * radius
bottom = center_lat + 1/111 * radius
top = center_lat + 1/111 * radius

latitude:[<bottom> TO <top>]) longitude:[<left> TO <right>]

Mit dieser Lösung ist es ohne viel Aufwand möglich, bestehende Lucene-Suchen um einen Umkreis-Filter zu erweitern.



09_2011

Rat & Hilfe Wir freuen uns über den Auftrag, den Relaunch von www.diakonie-hamburg.de durchzuführen.
Der neue Webauftritt ist als ein ausführliches Informationsportal für Rat- und Hilfesuchende geplant. Er soll damit der Stellung der Diakonie – als größter Wohlfahrtsverband in Hamburg – auch im Internet gerecht werden. Insbesondere für Menschen mit wenig Internet-Erfahrung soll das Suchen und Finden relevanter Informationen sehr einfach gestaltet werden. Kompletten Artikel lesen



Recommendation-Engine von Folge 3

Schwarm-Intelligenz. Empfehlungen bilden mit einer Recommendation Engine.

  • “Interessantes Thema! Welche Artikel behandeln ähnliche Themen?”
  • “Ich habe Rindfleisch, Zitronengras und Kardamom. Was passt dazu?”
  • “Diese Wohnung gefällt mir ganz gut. Was gibt es an vergleichbarem?

Solche und ähnliche Fragen lassen sich mit unserer Recommendation Engine beantworten.

Empfehlungsarten

Die Software bildet die folgenden Arten von Empfehlungen:

  • Produktempfehlungen
    Das ist die gut bekannte Funktion “Wer sich für dieses Produkt interessiert hat, interessierte sich auch für die Folgenden”. Die Empfehlungen basieren auf den anonymisierten Bewegungsmustern der Site-Besucher. Was ein “Produkt” ist, ist nur durch die Vorstellungskraft eingeschränkt. Wir empfehlen bereits jetzt Bücher, Nachrichten-Artikel, Bilder, Universitäten, Studiengänge, Rezepte
  • Unterstützes Auswählen
    In komplexen Eingabemasken werden Benutzer durch Realtime-Empfehlungen geleitet. Sobald die Benutzerin zwei oder drei Kriterien ausgewählt hat, werden ihr weitere Kriterien empfohlen.
  • Matching / Unscharfes Suchen
    Wenn Sie ihren Benutzer “Erweiterte Suchen” anbieten, also Suchmasken, in denen sich die Suche auf bestimmte Eigenschaften ihrer “Produkte” einschränken lässt, dann können Sie die Recommendation Engine benutzen, um diese Suchen unscharf durchzuführen. Unscharfe Suchen oder Matching finden den best fit, also auch Artikel, die nur einigen der Kriterien 100%ig entsprechen.
  • Profil-basierte Empfehlungen
    Diese Empfehlungen werden auf Basis der Ähnlichkeit von Benutzern untereinander gebildet. Im Gegensatz zu den vorherigen Methoden benutzt dieses Verfahren nicht die impliziten Bewegungsmustern sondern basiert auf Profil-Informationen, die zu einem Benutzer gespeichert sind.


Über die Recommendation Engine

Die Empfehlungs-Engine ist eine Software von Folge 3. Wie alle Recommendation-Ansätze versucht sie, semantisch bedeutsame Relationen zu entdecken und führt dazu statistische Analysen in Tracking-Daten durch.

Die Datenbestände müssen nicht riesig sein, um aussagekräftige Empfehlungen zu bilden. In einem einigermaßen homogenen Umfeld reichen um die zweitausend Tracking-Datensätze pro Tag aus.

Die Empfehlungs-Engine ist in Java implementiert und benötigt als Backend eine relationale Datenbank (Postgres, MySQL, Oracle).

Sie basiert auf Mahout, einem weiteren exzellenten Projekt aus dem Apache-Lucene-Dunstkreis.

Sie kann entweder als Bibliothek in bestehende Anwendungen integriert werden. Oder sie läuft als eigenständiger Server, der über eine REST-API Tracking-Daten entgegennimmt und Empfehlungen ausliefert.



Checkliste Interne Suche

Wie jeder weiss, hat das Thema “Suchen und Finden” in der digitalen Welt eine zentrale Bedeutung. Das gilt sowohl für den großen Zusammenhang, also für das Internet generell, als auch für die lokale Suche innerhalb einer Webseite.

In diesem Eintrag versuche ich die Eigenschaften einer lokalen Suche aufzulisten, die, meiner Meinung nach, auch von der einfachsten Implementierung erfüllt sein sollten. Kompletten Artikel lesen