Рельсы упругие, сортировка по расстоянию - PullRequest
0 голосов
/ 24 января 2019

У меня есть 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, поэтому помощь будет очень признательна.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...