2012-02-15 39 views
7

tôi đang sử dụng một geo_distance filter với tire trong truy vấn của tôi và nó hoạt động tốt:tính toán geo khoảng cách trong elasticsearch

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

tôi mong rằng kết quả sẽ bằng cách nào đó bao gồm khoảng cách tính đến vị trí địa lý mà tôi sử dụng cho bộ lọc của tôi.

có cách nào để yêu cầu elasticsearch đưa vào câu trả lời để tôi không phải tính toán bằng ruby ​​cho mọi kết quả không?

== CẬP NHẬT ==

i found the answer trong một nhóm google:

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

sắp xếp theo các _geo_distance sẽ mang lại khoảng cách trong kết quả thô.

+0

Cảm ơn bạn đã sắp xếp theo _geo_distance! – jspooner

+0

Ngoài ra, vui lòng xem https://github.com/karmi/tire/issues/417#issuecomment-7331381 và https://gist.github.com/1051213 – karmi

+1

@karmi để bạn có giải pháp tốt về cách đặt thực tế khoảng cách địa lý vào kết quả thay vì trường '' 'sắp xếp''? – phoet

Trả lời

1

Đối với những người có thể tự hỏi, khoảng cách được trả lại trong bất động sản loại kết quả tìm kiếm đàn hồi. Để truy cập nó và hiển thị nó trong khung nhìn, sử dụng phương thức each_with_hit. Ví dụ:

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" sửa đổi đối tượng kết quả và hiển thị đúng json. Cho đến thời điểm này để hoạt động, bạn phải đặt tải thành đúng khi tìm kiếm:

:load => true 
+0

Bất kỳ ai biết cách thực hiện điều này trong ElasticSearch Nest? – levininja

Các vấn đề liên quan