2012-02-15 16 views
7

estoy usando un geo_distance filter con tire en mi consulta y trabaja muy bien:Calcular distancia geográfica en elasticsearch

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

que esperaba que el resultado de alguna manera incluiría la distancia calculada a la ubicación geográfica de maquillaje que utilice mi filtro

¿Hay alguna manera de decirle a elasticsearch que incluya eso en la respuesta, para que no tenga que calcularlo en rubí para cada resultado?

== ACTUALIZACIÓN ==

i found the answer en un grupo de Google:

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

la clasificación por la _geo_distance producirá la distancia en los resultados primas.

+0

Gracias el ordenamiento por _geo_distance trabajado! – jspooner

+0

También, por favor, consulte https://github.com/karmi/tire/issues/417#issuecomment-7331381 y https://gist.github.com/1051213 – karmi

+1

@karmi ¿tiene una buena solución para saber cómo poner el verdadero geo-distancia en el resultado en lugar del campo '' 'sort''' – phoet

Respuesta

1

Para aquellos que pueden estar preguntándose, la distancia se devuelve en la propiedad de ordenación de los resultados de búsqueda elásticas. Para acceder a él y mostrarlo en la vista, use el método each_with_hit. Por ejemplo:

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 el objeto resultante y hace que la json adecuada. Hasta ahora para que esto funcione, debe establecer la carga en verdadero al buscar:

:load => true 
+0

¿Alguien sabe cómo hacer esto en ElasticSearch Nest? – levininja

Cuestiones relacionadas