Suche verstehen
Wir helfen Ihnen dabei, die Such­anfragen Ihrer Kund*innen und Mit­ar­bei­­ter*innen zu ver­stehen und schnell re­le­vante Ergebnisse zu liefern.

Umkreissuche mit Apache Solr

Solr bietet eine Reihe von Möglichkeiten, geographische Informationen abzulegen und zu selektieren. Aufbauend auf den Artikel Fallbeispiel Geosuche mit Apache Solr soll diese Anleitung die spezielle Anforderung der Umkreissuche mit Sortierung nach Distanz zum Mittelpunkt im Detail beschreiben.

Anforderungen der Umkreissuche an Solr

Solr Umkreissuche

  • Dokumente werden mit punktueller geographischer Information angereichert. Dabei werden Längen- und Breitengrad im WGS84 Format übergeben.
  • Bei der Abfrage sucht man nach jenen Dokumenten, die eine maximale Entfernung zu einem Abfragepunkt nicht überschreiten.
  • Die maximal zulässige Entfernung (= der Radius des Umkreises) wird in Kilometer definiert.
  • Die Ergebnisse sollen nach Entfernung zum Mittelpunkt der Abfrage sortierbar sein.
  • Beispielszenario: In einer mobilen Applikation sollen alle Restaurants im Umkreis von 5 km ausgehend vom aktuellen Standort des Benutzers angezeigt werden. In der Ergebnisliste sind die Treffer nach Entfernung zum Standort aufsteigend sortiert.

Vorbereitung des Index

Sollen zusätzlich zur Umkreissuche diverse geographische Abfragen möglich sein, können die Daten, wie im Artikel Solr Geospatial – 3 Schritte zur flexiblen Geosuche beschrieben, in ein Feld des Typs SpatialRecursivePrefixTreeFieldType indiziert werden. Ist die Umkreissuche der einzige Anwendungsfall, kann ein Feld des Typs LatLonType verwendet werden. Dieses reduziert die Funktionalität auf punktuelle Daten,  hat aber den Vorteil, dass die externe Bibliothek JTS nicht inkludiert werden muss. Diese vereinfachte Konfiguration sieht wie folgt aus:

<types>
  <fieldType name="latLon" class="solr.LatLonType" subFieldSuffix="_latLon"/></pre>
...
</types>

<fields>
  <field name="location" type="latLon" indexed="true" stored="false"/>
...
</fields>

Danach können lat/lon Daten mit Beistrich getrennt importiert werden:

<field name="lat_lon">48.37213,16.234234</field>

Abfrage mittels geofilt

Solr liefert bereits einen eingebauten Filter names geofilt, mit dem eine Umkreissuche durchgeführt werden kann. Um alle Treffer innerhalb von 10 km ausgehend vom Punkt (48.15,16.23) im Feld location zu finden, definiert man folgende Abfrage:

fq={!geofilt}&sfield=location&pt=48.15,16.23&d=10

[call-to-action-consulting /]

Ausgabe der Entfernung und Sortierung

Das oben genannte Beispiel kann noch um die Sortierung nach Entfernung zum Mittelpunkt erweitert werden. Dazu steht die Funktion geodist() zur Verfügung. Diese erzeugt bei der Abfrage die Entfernung für jedes Ergebnisdokument als virtuelles Feld. Dieses Feld kann einerseits zur Sortierung verwendet werden, andererseits auch zur Ausgabe an das jeweilige Dokument angehängt werden. Hier die vollständige Abfrage:

fq={!geofilt}&sfield=location&pt=48.15,16.23&d=10&sort=geodist()+asc&fl=id,name,calculatedDistance:geodist()
  1. Die Entfernung kann beliebig mit anderen Sortierfeldern kombiniert werden.
  2. Die berechnete Entfernung in Kilometer ist dann im Feld ‘calculatedDistance’ verfügbar
<result name="response" numFound="304" start="0">
  <doc>
    <str name="id">id-xy</str>
    <str name="name">Poi XY</str>
    <double name="calculatedDistance">2.028739106597272</double>
  </doc>
  <doc>
    <str name="id">id-a</str>
    <str name="name">Poi A</str>
    <double name="calculatedDistance">2.2260008106264744</double>
  </doc>
  <doc>
    <str name="id">id-bc</str>
    <str name="name">Poi BC</str>
    <double name="calculatedDistance">2.32673495741439</double>
  </doc>
  ....
</result>