i am using a geo_distance
filter with tire in my query and it works fine:
search.filter :geo_distance, :distance => "#{request.distance}km", :location => "#{request.lat},#{request.lng}"
i expected that the result would somehow include the computed distance to the geo-location that i used for my filter.
is there a way to tell elasticsearch to include that in the response, so that i don't have to calculate it in ruby for every result?
== UPDATE ==
i found the answer in a google group:
search.sort do
by "_geo_distance", "location" => "#{request.lat},#{request.lng}", "unit" => "km" if request.with_location?
end
sorting by the _geo_distance
will yield the distance in the raw results.
Sorting by _geo_distance
will return the distance in the results:
http://www.elasticsearch.org/guide/reference/api/search/sort.html
For those that may be wondering, the distance is returned in the sort property of the elastic search results. In order to access it and display it in the view, use the each_with_hit method. For instance:
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" modifies the resulting object and renders the proper json. So far for this to work, you must set load to true when searching:
:load => true
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With