我在查询中使用geo_distance
filter tire并且工作正常:
search.filter :geo_distance, :distance => "#{request.distance}km", :location => "#{request.lat},#{request.lng}"
我预计结果会以某种方式包含我用于过滤器的地理位置的计算距离。
有没有办法告诉elasticsearch在响应中包含它,这样我就不必为每个结果在ruby中计算它?
== UPDATE ==
我在谷歌小组中found the answer:
search.sort do
by "_geo_distance", "location" => "#{request.lat},#{request.lng}", "unit" => "km" if request.with_location?
end
按_geo_distance
排序将产生原始结果中的距离。
答案 0 :(得分:3)
按_geo_distance
排序将返回结果中的距离:
http://www.elasticsearch.org/guide/reference/api/search/sort.html
答案 1 :(得分:1)
对于那些可能想知道的人,在弹性搜索结果的sort属性中返回距离。要访问它并在视图中显示它,请使用each_with_hit方法。例如:
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”修改生成的对象并呈现正确的json。到目前为止,为了实现这一点,您必须在搜索时将load设置为true:
:load => true