Единицы запроса эластичного поиска, чтобы получить расстояние от произвольной точки до 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

Везде, где необходимо указать расстояния (например, параметр расстояния в запросе о географическом расстоянии), единицей по умолчанию, если не указано иное, является метр.

Другие вопросы по тегам