做GIS开发的兄弟,谁没被Elasticsearch的geo_shape坑过?
刚入行那会儿,我觉得自己挺牛。
后来遇到多边形查询,直接傻眼。
官方文档写得云里雾里。
我也试过用geo_point硬扛。
结果呢?稍微复杂点的区域,比如不规则的园区。
根本查不准,甚至报错。
那段时间,我头发掉了一把。
真的,那种无力感太难受了。
但今天,我把压箱底的经验掏出来。
保证你看完就能上手。
不用去啃那些晦涩的源码。
咱们直接看实操,简单粗暴。
第一步,数据准备别偷懒。
很多新人喜欢用经纬度点凑合。
记住,geo_shape的核心是“形状”。
你得先有GeoJSON数据。
比如一个多边形的坐标数组。
别直接往库里插原始坐标。
先确保你的GeoJSON格式标准。
特别是坐标顺序,经度在前,纬度在后。
这点千万别搞反,否则查出来的结果南辕北辙。
我见过太多人栽在这个低级错误上。
明明数据是对的,查询就是零结果。
排查半天,才发现坐标轴写反了。
第二步,Mapping定义要精准。
别用默认的dynamic mapping。
那玩意儿有时候会抽风。
手动建索引,指定字段类型为geo_shape。
关键参数index=true。
还有tree=geohash或者quadtree。
这里有个坑,新手容易忽略。
如果你查的是小范围,用geohash效率高。
如果是大范围或者复杂形状,quadtree更稳。
我一般推荐用geohash_level=5。
这个层级平衡了精度和性能。
别设太高,否则内存爆炸。
也别设太低,查询慢得像蜗牛。
第三步,查询语句怎么写。
别用match_query,那是查文本的。
要用geo_shape_query。
里面有个relation参数。
包含关系选contains。
相交关系选intersects。
被包含选within。
这个relation参数太重要了。
选错了,结果要么空,要么全。
我有一次把contains写成intersects。
结果把边界上的点都查出来了。
导致业务逻辑全乱套。
那天晚上我改Bug改到凌晨三点。
现在想想都后怕。
咱们来对比一下数据。
用geo_point查多边形,速度是毫秒级。
但精度差得离谱。
误差能达到几百米。
用geo_shape查,虽然写入稍慢。
但查询精度在米级甚至亚米级。
对于地图业务,这点延迟完全可接受。
毕竟用户在乎的是准,不是快那零点几秒。
结论很明确。
只要涉及非点状地理数据。
别犹豫,直接用geo_shape。
虽然学习曲线有点陡。
但一旦掌握,真香。
别再问为什么查不到数据了。
大概率是你坐标顺序错了。
或者relation参数没选对。
这两个坑,我踩了两年才填平。
希望兄弟们能少走弯路。
做技术就是这样,痛并快乐着。
每次解决一个难题,都爽翻。
如果你还在用geo_point硬撑。
赶紧转型吧。
es地理位置 geo_shape 才是正解。
别等数据量大了,再后悔。
那时候迁移成本,高到你哭。
我就遇到过这样的客户。
前期图省事,没规划好。
后期想改,数据量太大。
只能停机迁移,损失惨重。
所以,一步到位最划算。
把基础打牢,后面省心。
这篇文章,全是干货。
没有废话,没有营销。
就是纯纯的技术分享。
希望能帮到正在挣扎的你。
如果有问题,评论区见。
咱们一起探讨,一起进步。
毕竟,独行快,众行远。
在这个行业,互助才是王道。
加油,GIS人!
本文关键词:es地理位置 geo_shape