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_typearcDistance

也一样

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'] + ")"
    }
}