2012-02-15 12 views
7

używam geo_distance filter z tire w mojej kwerendy i działa prawidłowo:obliczeniowej geo odległość w elasticsearch

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

spodziewałem się, że wynik będzie jakoś obejmują obliczoną odległość do geolokalizacji, że użyłem do mój filtr.

Czy istnieje sposób, aby powiedzieć elasticsearch, aby uwzględnić to w odpowiedzi, aby nie musiałem go obliczyć w rubinach dla każdego wyniku?

UPDATE == ==

i found the answer w grupie dyskusyjne:

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

sortowania przez _geo_distance przyniesie odległości w surowych wyników.

+0

Dziękuję, że sortowanie działało przez _geo_distance! – jspooner

+0

Zobacz również https://github.com/karmi/tire/issues/417#issuecomment-7331381 i https://gist.github.com/1051213 – karmi

+1

@karmi czy masz dobre rozwiązanie, aby umieścić rzeczywisty geo-odległość do wyniku zamiast pola '' 'sort'''? – phoet

Odpowiedz

1

Dla tych, które mogą się zastanawiać, odległość jest zwracany we właściwości sortowania elastycznych wyników wyszukiwania. Aby uzyskać do niego dostęp i wyświetlić go w widoku, użyj metody each_with_hit. Na przykład:

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 

"every_with_hit" modyfikuje wynikowy obiekt i renderuje właściwy json. Do tej pory, aby to zadziałało, musisz ustawić load na true podczas wyszukiwania:

:load => true 
+0

Ktoś wie jak to zrobić w ElasticSearch Nest? – levininja

Powiązane problemy