2012-02-15 4 views
7

Sto usando un geo_distance filter con tire nella mia interrogazione e funziona benissimo:Calcola distanza geo in elasticsearch

search.filter :geo_distance, :distance => "#{request.distance}km", :location => "#{request.lat},#{request.lng}" 

mi aspettavo che il risultato sarebbe in qualche modo comprendere la distanza calcolata alla geo-localizzazione, che ho usato per il mio filtro

c'è un modo per dire a elasticsearch di includerlo nella risposta, in modo che non debba calcolarlo in ruby ​​per ogni risultato?

== AGGIORNAMENTO ==

i found the answer in un gruppo google:

search.sort do 
    by "_geo_distance", "location" => "#{request.lat},#{request.lng}", "unit" => "km" if request.with_location? 
end 

classificare dal _geo_distance produrrà la distanza nei risultati grezzi.

+0

Grazie, l'ordinamento di _geo_distance ha funzionato! – jspooner

+0

Vedere anche https://github.com/karmi/tire/issues/417#issuecomment-7331381 e https://gist.github.com/1051213 – karmi

+1

@ karmi avete una buona soluzione per come mettere il reale geo-distance nel risultato invece del campo '' 'sort'''? – phoet

risposta

1

Per coloro che potrebbe chiedere, la distanza viene restituito nella proprietà tipo di risultati di ricerca elastiche. Per accedervi e visualizzarlo nella vista, utilizzare il metodo each_with_hit. Per esempio:

class Venue 
    attr_accessor :distance 
end 

def index 
    @search = Venue.search(params) 
    @search.each_with_hit do |result, hit| 
     result.distance = hit['sort'][0] # distance from the ES results 
    end 
    render json: @search.results 
end 

"each_with_hit" modifica l'oggetto risultante e rende il corretto json. Per il momento, affinché funzioni, è necessario impostare il caricamento su true durante la ricerca:

:load => true 
+0

Qualcuno sa come farlo in ElasticSearch Nest? – levininja