#elasticsearch #location #geopoints
#elasticsearch #Расположение #географические точки
Вопрос:
В Elasticsearch.js .
версия elsaticsearch 2.3.4
используйте код, подобный этому
body: {
from: data['offset'] || 0
, size: data['limit'] || 20
, query: {
bool: {
must: {
range: {
state: {
gte: 0
}
}
}
, filter: {
geo_distance_range: {
from: data['from'] || '0km'
, to: data['to'] || '5km'
, location: {
lat: data['lat']
, lon: data['lon']
}
}
}
}
}
, sort: [{
_geo_distance: {
location: {
lat: data['lat']
, lon: data['lon']
}, order: 'asc'
, unit: 'm'
}
}]
, script_fields: {
distance: {
lang: "groovy",
script: "doc['location'].distanceInKm(" data['lat'] "," data['lon'] ")*1000"
}
}
}
запустите это, просто получите
[
{
"_index": "stores_location_v1",
"_type": "location_info",
"_id": "65",
"_score": null,
"fields": {
"distance": [
632.513773747282
]
},
"sort": [
631.9282534390322
]
},
{
"_index": "stores_location_v1",
"_type": "location_info",
"_id": "100976",
"_score": null,
"fields": {
"distance": [
772.123560941117
]
},
"sort": [
656.1648199724189
]
},
{
"_index": "stores_location_v1",
"_type": "location_info",
"_id": "64",
"_score": null,
"fields": {
"distance": [
663.1312353690903
]
},
"sort": [
662.5164209175506
]
},
{
"_index": "stores_location_v1",
"_type": "location_info",
"_id": "100542",
"_score": null,
"fields": {
"distance": [
695.1804755172814
]
},
"sort": [
669.5809632061855
]
}
]
Результат, вычисленный с помощью _geo_distance в sort, не равен результату, вычисленному с использованием метода distanceInKm в script_fields .
Я хочу знать, почему это так? Тогда что нужно сделать? Есть ли способ заменить distanceInKm
вычисления на m
основе for вместо km
и затем * 1000 . Является ли это частью причины потери точности?
А также, я просто хочу рассчитать расстояние между одной точкой и другой точкой, как следует вычислять? script_fields`` distanceInKm
Подход прямого использования?
Ответ №1:
search-request-sort.html#геосортировка
modules-scripting.html#_document_fields
просто используйте distance_type
и arcDistance
то же самое для
sort: [{
_geo_distance: {
location: {
lat: data['lat']
, lon: data['lon']
}, order: 'asc'
, unit: 'm'
, "distance_type": "arc"
}
}]
, script_fields: {
distance: {
lang: "groovy",
script: "doc['location'].arcDistance(" data['lat'] "," data['lon'] ")"
}
}