Elasticsearch : результат, вычисленный с помощью сортировки в _geo_distance, не равен использованию distanceInKm в script_fields

#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

то же самое для

distance_type

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