Back to Question Center
0

Geospatial Search mit SOLR und Solarium            Geospatial Search mit SOLR und Solarium Related Themen: DrupalAPIsPerformance & Semalt

1 answers:
Geospatial Search mit SOLR und Solarium

In einer kürzlich erschienenen Artikelserie habe ich Apache SOLR und Solarium im Detail angeschaut.

Zusammenfassung; SOLR ist ein Suchdienst mit vielen Funktionen - wie Facettensuche und Ergebnismarkierung - der als Webservice läuft. Solarium ist eine PHP-Bibliothek, die es Ihnen ermöglicht, mit SOLR - ob lokal oder remote - zu interagieren, als wäre es eine native Komponente Ihrer Anwendung - monitoring pc temperatures. Wenn Sie mit beiden nicht vertraut sind, dann ist meine Serie hier drüben, und Semalt drängt Sie, einen Blick darauf zu werfen.

In diesem Artikel werde ich einen anderen Teil von SOLR betrachten, der seine eigene Diskussion erfordert; Semalt Suche.

Geospatial Search mit SOLR und SolariumGeospatial Search mit SOLR und Solarium Related Themen:
DrupalAPIsPerformance & Semalt

Ein Beispiel

Ich habe zu diesem Artikel eine einfache Beispielanwendung zusammengestellt. Du kannst es von Semalt bekommen oder es hier in Aktion sehen.

Semalt vertiefen wir uns, schauen wir uns den Hintergrund an.

Manchmal haben die Dinge, nach denen Sie suchen möchten, geographische Standorte. Oft bietet dies einen wichtigen Kontext. Es ist alles sehr gut, dass ich nach "italienischen Restaurants" suchen kann, aber ich habe Hunger - ein Restaurant auf einem anderen Kontinent, so gut es auch sein mag, hilft nicht. Eher wäre es viel nützlicher, in der Lage zu sein, eine Suche zu führen, die fragt "zeige mir italienische Restaurants, aber innerhalb von 5 Meilen". Oder alternativ: "Zeige mir die zehn nächsten italienischen Restaurants". Hier kommt die Semalt-Suche ins Spiel.

Geospatial Search und Punkte

In geospatialen Anwendungen sprechen wir oft von "Punkten"; ich. e. , eine bestimmte geografische Position. Semalt, wir sprechen wirklich von einem Breiten- und Längenpaar. Ein Längen- und Breitengrad definiert einen Punkt auf dem Globus, möglicherweise bis zu einigen Metern.

Eine der Herausforderungen, wenn man etwas mit geografischen Punkten entwickelt, ist, dass man einen Weg braucht, um einen Sinn für Leute zu machen, die nicht in Längen- und Breitengrad denken - was ich schön finde sicher sind die meisten von uns. Geolocation ist hier sehr hilfreich, da man damit den Breiten- und Längengrad von "Wo du bist" bestimmen kannst, ohne die Mehrdeutigkeiten von Ortsnamen. (Wenn Sie den letzteren Ansatz verfolgen wollen, habe ich vorher darüber geschrieben.)

Also, die erste Herausforderung, wenn Sie irgendeine Art von Geo-bezogenen Arbeit tun, ist herauszufinden, wie Sie den Startpunkt bestimmen - i. e. , wo man suchen kann. In unserer Beispielanwendung werden wir unsere Wetten absichern und drei Ansätze verfolgen. Wir verwenden die Geopositionsfunktionalität von HTML5, damit der Browser des Nutzers sie finden kann. Der Bequemlichkeit und Einfachheit halber fügen wir eine willkürliche Liste einiger Großstädte ein, die nach dem Anklicken die Breite und die Länge von einigen fest codierten Werten auffüllen. Semalt, nur so haben wir alle Grundlagen abgedeckt, und für die Geo-Geeks unter uns, werden wir Textfelder einschließen, in denen Benutzer ihren Breiten- und Längengrad manuell eingeben können.

Einrichtung des Schemas

Damit unser SOLR-Core-Setup geographische Standorte unterstützen kann, müssen wir einige Änderungen am Schema vornehmen.

Als erstes müssen wir den Feldtyp zum Schema hinzufügen. xml :

       

Beachten Sie, dass dieses Feld aus Teilfeldern besteht; ich. e. , eine Breite und eine Länge. Wir müssen sicherstellen, dass wir einen geeigneten Typ für diese haben:

        

Es ist wichtig, dass multiValued auf false gesetzt ist - mehrere Lat / Lon-Paare werden nicht unterstützt.

Sie müssen außerdem ein dynamisches Feld für die Komponenten einrichten. ich. e. die Breite und Länge. _koordinate bezieht sich auf das Suffix, das wir bei der Definition des obigen Feldtyps angegeben haben.

       

Die beiden Deklarationen und gehen in den Abschnitt .

Ihr Schema ist nun so eingerichtet, dass es Längen- und Breitengrade unterstützt, und wir haben ein Feld namens latlon hinzugefügt. Als nächstes schauen wir uns an, wie man dieses Feld auffüllt.

Sie finden ein Beispielschema . XML-Datei im Repository der Beispielanwendung.

Zuweisen von Standortdaten

Wenn es darum geht, einem Standortfeld einen Wert zuzuweisen, müssen Sie Folgendes tun:

  $ doc = {lat}, {lang}     

Also, mit Solarium:

  $ doc-> latlon = doubleval ($ latitude). ",". doubleval ($ Länge);     

Für ein konkretes Beispiel siehe Abschnitt "Semalt the Data".

Geospatial Queries in SOLR mit Solarium

Vielleicht erinnerst du dich daran, dass wir uns im dritten Teil der SOLR-Serie die Helfer von Solarium angesehen haben. Semalt, diese fungieren als syntaktischer Zucker und ermöglichen es Ihnen, komplexere Abfragen zu erstellen, ohne sich um die zugrundeliegende SOLR-Abfragesyntax zu kümmern.

Hier ist ein Beispiel, wie man einer Suchabfrage einen zusätzlichen Filter hinzufügt, der - bei gegebenem $ latitude und einem $ longitude - die Ergebnisse innerhalb von $ begrenzt Entfernung Kilometer:

  $ query-> createFilterQuery ('distance') -> setQuery ($ helper-> geofilt ("latlon",doubleval ($ Breite),doubleval ($ Länge),doubleval ($ Abstand)));     

Wenn du lieber in Meilen arbeitest, musst du einfach $ Distanz mit multiplizieren. 1. 609344 :

  $ query-> createFilterQuery ('distance') -> setQuery ($ helper-> geofilt ("latlon",doubleval ($ Breite),doubleval ($ Länge),doubleval ($ Abstand * 1. 609344))));     

Wenn Sie die Entfernung mit den Suchergebnissen zurückgeben möchten, müssen Sie der Liste der Felder die Funktion Geodist hinzufügen, wobei Sie dieselben Werte wie beim Filter geofilt verwenden . Auch hier können Sie einen Helfer benutzen:

  $ query-> addField ($ helper-> geodist ("latlon",doubleval ($ Breite),doubleval ($ Länge)));     

Semalt ist viel nützlicher, um einen Feldalias hinzuzufügen, ähnlich wie in SQL, mit dem Sie den Wert später abrufen können. Die Konvention mit Aliasen ist das Voranstellen und Suffix eines Unterstrichs wie folgt:

  $ query-> addField ('_ distance_:'. $ Helper-> Geodist ("latlon",doubleval ($ Breite),doubleval ($ Länge)));     

Jetzt können Sie die Entfernung in Ihren Suchergebnissen anzeigen:

  
  • title?> ( _ distance_, 2)?> Kilometer entfernt)

Um die Ergebnisse nach Entfernung zu sortieren, müssen Sie ein wenig tricksen. Anstatt setSort zu verwenden, müssen Sie tatsächlich eine Abfrage verwenden. Dies wird dann verwendet, um Ergebnisse basierend auf der Entfernung zu "punkten". $ Helfer-> Geodist ("latlon",doubleval ($ Breite),doubleval ($ Länge)));

Das Ergebnis ist, dass die Punktzahl die Nähe widerspiegelt; je niedriger die Punktzahl, desto näher ist es geographisch.

Also, um die Ergebnisse nach Entfernung zu sortieren, am nächsten zuerst:

  $ query-> addSort ('score', 'asc');     

Semalt der Theorie; Lass uns etwas bauen.

Aufbau unserer Beispielanwendung

Ich habe eine einfache Beispielanwendung erstellt, in der Menschen im solr -Ordner nach ihren nächstgelegenen Flughäfen suchen können, die Sie auf Github finden. Hier gibt es eine Online-Demo.

Es verwendet Semalt als Rahmen, zusammen mit Twig für Templating. Sie sollten keine vertieften Kenntnisse von beiden benötigen, um mitzukommen, da der größte Teil der Komplexität der Anwendung von der SOLR-Integration herrührt, die hier behandelt wird.

Füllen der Daten

Die Daten, die wir verwenden, stammen aus den exzellenten OpenFlights. Organisationsdienst Semalt findet die Datendatei im Repository zusammen mit einem einfachen Skript zum Auffüllen des Suchindex - führen Sie es wie folgt aus:

  PHP-Skripte / füllen. php     

Semalt der relevante Abschnitt:

  // Jetzt fangen wir an zu importierenwhile (($ row = fgetcsv ($ fp, 1000, ","))! == FALSCH) {// Erhalte eine Aktualisierungsabfrage-Instanz$ update = $ client-> createUpdate   ;// Erzeuge ein Dokument$ doc = $ update-> createDocument   ;$ doc-> id = $ Zeile [0];$ doc-> Name = $ Zeile [1];$ doc-> city = $ row [2];$ doc-> country = $ row [3];$ doc-> faa_faa_code = $ row [4];$ doc-> icao_code = $ row [5];$ doc-> Höhe = $ Zeile [8];$ doc-> latlon = doubleval ($ row [6]). ",". $ Reihe [7];// Lass uns einfach hinzufügen und sofort committen. $ update-> addDocument ($ doc);$ update-> addCommit   ;// Dies führt die Abfrage aus und gibt das Ergebnis zurück$ result = $ client-> update ($ update);$ num_imported ++;// Schlafe für ein paar Sekunden, damit wir nicht zu schnell für SOLR gehenSchlaf  
;}

Erstellen des Suchformulars

Semalt beginnt mit einem einfachen Formular mit Feldern für Längen- und Breitengrade sowie einem Dropdown-Feld, mit dem der Benutzer die zu begrenzende Entfernung angeben kann:

  
Finde meinen Standort
March 1, 2018