Elasticsearch : _geo_distance中排序计算的结果不等于script_fields中使用distanceInKm
Elasticsearch : The result calculated by sort in _geo_distance is not equal to using distanceInKm in script_fields
在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
]
}
]
sort中_geo_distance计算的结果与script_fields中distanceInKm方法计算的结果不相等
我想知道这是为什么?那该怎么办呢?
有没有一种方法可以将 distanceInKm
替换为基于 m
的计算,而不是 km
然后 * 1000。
这是造成精度损失的部分原因吗?
还有,我只想计算一个点到另一个点的距离,应该怎么计算?直接使用script_fields`` distanceInKm
的方式?
search-request-sort.html#geo-sorting
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'] + ")"
}
}
在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
]
}
]
sort中_geo_distance计算的结果与script_fields中distanceInKm方法计算的结果不相等
我想知道这是为什么?那该怎么办呢?
有没有一种方法可以将 distanceInKm
替换为基于 m
的计算,而不是 km
然后 * 1000。
这是造成精度损失的部分原因吗?
还有,我只想计算一个点到另一个点的距离,应该怎么计算?直接使用script_fields`` distanceInKm
的方式?
search-request-sort.html#geo-sorting
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'] + ")"
}
}