У меня есть account model
, где у каждой учетной записи есть столбцы category_id:integer
и latitude:float
longitude:float
.
Я получаю столбцы широты и долготы, заполненные по полному адресу и geocoded gem.
Также я использую геолокацию html5, чтобы узнать текущее местоположение пользователя, а затем сохраняю координаты в куки lat_lng
:
function getLocation() {
if (navigator.geolocation) {
navigator.geolocation.getCurrentPosition(setGeoCookie,showError);
} else {
alert("Geolocation is not supported by this browser.");
}
}
function setGeoCookie(position) {
var cookieName = "lat_lng";
var now = new Date();
var time = now.getTime();
time += 3600 * 2000;
now.setTime(time);
var cookie_val = position.coords.latitude + "," + position.coords.longitude;
document.cookie = cookieName +"=" + cookie_val + '; expires=' + now.toUTCString() + '; path=/';
}
function showError(error) {
switch(error.code) {
case error.PERMISSION_DENIED:
window.location = window.location;
window.alert("Please click on allow");
break;
case error.POSITION_UNAVAILABLE:
window.location = window.location;
window.alert("Location information is unavailable.");
break;
case error.TIMEOUT:
window.location = window.location;
window.alert("The request to get user location timed out.");
break;
case error.UNKNOWN_ERROR:
window.location = window.location;
window.alert("An unknown error occurred.");
break;
}
location.reload();
}
Моя цель - найти и найти учетную запись по category_id ... что я делаю так внутри контроллера:
@results = Account.__elasticsearch__.search(query: {match: { category_id: params[:category_id]}})
Это прекрасно работает!
И после этого я хотел бы отсортировать результаты по расстоянию и в радиусе 25 миль от текущего местоположения пользователей ... что я пытаюсь сделать так:
@results = Account.__elasticsearch__.search(query: {match: { category_id: params[:category_id]}}, sort: [{_geo_distance: {location: {lat: current_location[0], lon: current_location[1]}, order: "asc", unit:"miles"}}])
def current_location
@lat_lng = cookies[:lat_lng].split(",")
end
выше выдает эту ошибку:
[400] {"error":{"root_cause":[{"type":"illegal_argument_exception","reason":"failed to find mapper for [location] for geo distance based sort"}],"type":"search_phase_execution_exception","reason":"all shards failed","phase":"query","grouped":true,"failed_shards":[{"shard":0,"index":"accounts","node":"AfyW4Pa4S-qKhua-3lY4rg","reason":{"type":"illegal_argument_exception","reason":"failed to find mapper for [location] for geo distance based sort"}}],"caused_by":{"type":"illegal_argument_exception","reason":"failed to find mapper for [location] for geo distance based sort","caused_by":{"type":"illegal_argument_exception","reason":"failed to find mapper for [location] for geo distance based sort"}}},"status":400}
Я вроде новичок вasticsearch, поэтому помощь будет очень признательна.