2016-03-27 7 views
2

Ich versuche Searchkick auf einer kleinen Rails App Geospatial-Suche durchführen, aber ich kann es nicht zum Laufen zu bringen.Searchkick Schienen Geospatial Suche funktioniert nicht

Ich habe ein Venue Modell:

class Venue < ActiveRecord::Base 
    has_and_belongs_to_many :categories 
    searchkick locations: ["location"] 

    def search_data 
    attributes.merge location: [latitude, longitude] 
    attributes.merge categories_title: categories.map(&:name) 
    end 
end 

Ich habe Daten in meiner Datenbank hinzugefügt, und ich habe Venue.reindex zu laufen.

In meinem Controller Ich versuche, indem Sie suchen:

term = "london" 
    res = Geocoder.search(term) 
    @location = res.first.geometry['location'] # lat/lng 
     @venues = Venue.search '*', where: { 
    location: { 
     near: [@location['lat'],@location['lng']], 
     within: '2km' 
    } 
    } 

Ich habe zwar gültige Daten in meiner Datenbank, habe ich immer ein leeres Ergebnis. Betrachtet man Schienen-Konsole, ist die Abfrage gegen elasticsearch durchgeführt:

{ 
    "query":{ 
    "filtered":{ 
     "query":{ 
     "match_all":{ 

     } 
    }, 
    "filter":{ 
     "and":[ 
      { 
       "geo_distance":{ 
       "location":[ 
        -0.08077990000000002, 
        51.5037119 
       ], 
       "distance":"2km" 
       } 
      } 
     ] 
    } 
    } 
}, 
"size":1000, 
"from":0, 
"sort":{ 
    "_geo_distance":{ 
    "location":"51.5037119,-0.08077990000000002" 
    } 
}, 
"fields":[ 
    ] 
} 

Irgendwelche Ideen?

Dank

+1

Haben Sie eine Lösung gefunden? Ich habe das Problem, dass bei Verwendung eines Entfernungsfilters keine Ergebnisse erzielt werden. – Patelify

+0

@Pelify nicht sicher, ob Sie versucht haben, was Caleuanhopkins erwähnt. Am Ende habe ich ein anderes Juwel benutzt, das mir einen niedrigeren Zugriff auf die Abfrage ermöglicht. Mein Repo: https://github.com/pedropaf/elasticsearch-rails-geolocation/blob/master/app/controllers/venues_controller.rb –

+1

Ich habe es herausgefunden. Wie die meisten Dinge im Leben war es ein Benutzerfehler. Ich habe die search_data-Methode falsch eingegeben. Ich habe 'Breitengrad' statt 'Breitengrad' und 'Längengrad' anstelle von 'lon' für das Standortattribut verwendet. – Patelify

Antwort

1

Paar Dinge:

  • Sie location als geo_point kartiert? Wenn nicht, können Sie tun:

    searchkick merge_mappings: true, mappings: {venue: {properties: {locations: {type:"geo_point"}}}}, locations: ["location"]

  • "distance":"2km" - Ich habe bemerkt, Elasticsearch Fehler mit der Einheit der Distanz zu werfen. Das Entfernen der km könnte Ihnen helfen. Standardmäßig verwendet ES km für die Entfernung, also werfen Sie einfach die Distanznummer ohne die Einheit

  • match_all - sollte funktionieren. Ich sehe Ihre Weitergabe * was gut ist, da ES dies als einen Platzhalter oder einen "Alles suchen" Befehl sieht. Wenn Sie die match Abfrage von searchkick verwenden, müssen Sie möglicherweise überprüfen, ob der "Schlüsselwort" -Parameter leer ist und wenn es ist, übergeben Sie * als leer lassen wird nicht funktionieren.

hatte Ihr Problem heute Morgen und ich war in der Lage Ergebnisse zu erhalten, nachdem diese Änderungen

0

Wir hatten dieses Problem auf einem unserer Tische für eine lange Zeit. Mit einem kürzlichen Update von Searchkick haben wir es gelöst, indem wir die Methode verwenden, immer einen Ort mit einem Hash anzugeben, d. H. {Lat: 37.12, lon: -121.12}, wo immer es möglich ist. Die alte Methode der Verwendung eines Arrays war anfällig für Fehler in der Reihenfolge in unserem Code und im Suchkick und die Verwendung eines Hashes stellt sicher, dass der korrekte Wert dorthin gelangt, wo er hingehört. Ich fing an, den Quellcode von searchkick zu betrachten und erkannte, dass es jetzt den Hash überall nehmen würde, also versuchte ich von der alten dokumentierten Methode des Arrays für den Ort zum Hash zu wechseln, das Modell zu aktualisieren und dann die Tabelle neu zu indizieren.