Получить расстояние от каждой координаты из результатов эластичного поиска

#elasticsearch

#elasticsearch

Вопрос:

Мне нужно отфильтровать записи, наиболее близкие к заданным координатам. Из приведенного ниже запроса удаление script_fields будет работать (выдает результаты).

Необходимо получить расстояние для каждого совпадающего результата.

 GET story/_search
{
  "_source": [
    "title.english", "location"
  ],
  "query": {
    "bool": {
      "filter": [
        {
          "geo_distance": {
            "distance": "1000km",
            "location": {
              "lat": 57.3079700,
              "lon": 123.4977090
            }
          }
        }
      ]
    }
  },
  "script_fields": {
    "distance": {
      "script": "doc['location'].distanceInKm(57.3079700, 123.4977090)"
    }
  }
}
  

Ниже приведена ошибка

 "failures" : [
      {
        "shard" : 1,
        "index" : "story",
        "node" : "asdf-asdf",
        "reason" : {
          "type" : "script_exception",
          "reason" : "runtime error",
          "script_stack" : [
            "doc['location'].distanceInKm(57.3079700, 123.4977090)",
            "               ^---- HERE"
          ],
          "script" : "doc['location'].distanceInKm(57.3079700, 123.4977090)",
          "lang" : "painless",
          "caused_by" : {
            "type" : "illegal_argument_exception",
            "reason" : "dynamic method [org.elasticsearch.index.fielddata.ScriptDocValues.GeoPoints, distanceInKm/2] not found"
          }
        }
      }
    ]
  },
  

Комментарии:

1. похоже, вспомогательный метод distanceInKm удален. Ссылка ссылки: elastic.co/guide/en/elasticsearch/reference/5.6 /…

Ответ №1:

Как указал @Sharath, устарело distanceInKm . В наши дни вы можете использовать arcDistance и преобразовать значение в км путем деления на 1000.

 GET my-index-000001/_search
{
  ...
  "script_fields": {
    "distance": {
      "script": "doc['location'].arcDistance(57.3079700, 123.4977090) / 1000"
    }
  }
}
  

Вот список поддерживаемых в настоящее время методов гео и вот arcDistance источник.