Единицы запроса эластичного поиска, чтобы получить расстояние от произвольной точки до Geopoint
У меня есть проект django, который использует asticsearch 6.5.3 для индексации товаров в магазине с местоположениями в виде GeoPoints. Я пытаюсь запросить этот индекс, а также рассчитать расстояние между произвольной точкой, скажем, местоположение пользователя для каждого из этих результатов.
Я использую asticsearch_dsl и мой код выглядит примерно так:
search_query = search_query.script_fields(distance={
'script':{
'inline':"doc['location'].arcDistance(params.lat, params.lon)",
'params': {
'lat':user_loc.lat,
'lon':user_loc.lon
}
}
})
for result in search_query.execute():
print(result.distance)
Что дает мне значения, которые выглядят так:
[123456.456879123]
Но я не уверен насчет своих подразделений. Используя и онлайн калькулятор расстояния в https://www.nhc.noaa.gov/gccalc.shtml, который дает мне расстояние как ~123 км, похоже, значение в метрах.
Так:
1. Где я могу найти некоторые окончательные ответы о его единицах?
Пожалуйста, укажите мне соответствующую документацию для этих методов. Мне также интересно узнать, есть ли способ указать единицы измерения, ожидаемые для результатов в вызове метода.
2. Есть ли лучший способ сделать это в Python?
2 ответа
Единицы возвращаются arcDistance
метод, предоставляющий значение в вашем скрипте.
Расстояние дуги (в метрах) этого поля географической точки от предоставленного широты / долготы
Безболезненные документы оставляют желать лучшего (в 6.5 нет документов по этому методу). Цитата выше была получена здесь: https://www.elastic.co/guide/en/elasticsearch/reference/2.3/modules-scripting.html
Кроме того, они упоминают arcDistance
рассчитать счетчики здесь: https://www.elastic.co/guide/en/elasticsearch/reference/5.5/breaking_50_scripting.html
Я не уверен насчет точного Python API, но у Flexiblesearch есть Geo Distance Query: https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-geo-distance-query.html
В: https://github.com/elastic/elasticsearch-dsl-py/issues/398 есть пример использования Python ES API:
MyDocType.search().filter(
'geo_distance', distance='1000m', location={"lat": "40", "lon": "-74"}
)
Запрос 'geo_distance' - это самый простой способ получить расстояние между двумя географическими точками, индексированными для эластичного поиска. Я думаю, что вам не нужно использовать сценарии для достижения этого.
Что касается расстояния, то, как вы подозревали, по умолчанию используются метры. от: https://www.elastic.co/guide/en/elasticsearch/reference/current/common-options.html
Везде, где необходимо указать расстояния (например, параметр расстояния в запросе о географическом расстоянии), единицей по умолчанию, если не указано иное, является метр.