elasticsearch plane 踩的坑

問題背景:在使用ES內置的座標距離篩選功能時,出現了問題,有一部分理論上平面距離大於界定值的數據,並沒有被篩選掉

 

因爲百度和google找到的文獻,都只是提及了ES的plane算法的優勢劣勢,但對其具體實現都是沒有提及,所以我只能硬着頭皮去github上摳ES開源源碼,最終找到問題原因。

 

問題原因:由於項目在小範圍的距離計算上採用的是最基本的平面座標距離計算公式:

是完全將經緯度座標作爲平面座標來計算,最終再乘上一個統一的係數得出距離。

而ES內置plane的具體實現是

可見公式截然不同,結果有差距也是理所當然了,因爲這部分源碼二次開發的權利不在我這,而且ES不只是我現在這個項目在使用,所以想更改源碼是不行了,由於暫時不能更改老的解決方案,所以最終決定使用腳本方式而不是使用ES的API去實現這個距離計算操作。

下文只留給對這套距離計算理論感興趣的人,ES內部有多種距離計算方式,plane是性能高但準確性一般的方式,經過學習,其使用的是Equirectangular approximation算法,以下對其性能優勢做了詳細闡述

其理論支撐我就不在這贅述了,如有興趣自行查閱。

最後,還有很多其他根據經緯座標計算距離的算法,見http://www.movable-type.co.uk/scripts/latlong.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章