当前位置: 首页 > news >正文

第五阶段 50 · geo 地理查询(geo_point / geo_distance)

50 · geo 地理查询(geo_point / geo_distance)

阶段:第五阶段 / 进阶(可选,业务涉及地理位置时)
ES:geo_point/geo_shape+geo_distance/geo_bounding_box| PostgreSQL:PostGISgeography/ST_DWithin


1. 概念

存经纬度并按「距离/范围」检索,就用地理类型:

类型用途
geo_point一个点(经纬度),最常用
geo_shape线/面/多边形等复杂形状

常见查询:geo_distance(某点 N 公里内)、geo_bounding_box(矩形框内)、
geo_distance聚合/排序(按距离排序、分环统计)。


2. PostgreSQL 对照

-- PostGIS:5km 内的门店SELECT*FROMstoresWHEREST_DWithin(geog,ST_MakePoint(:lon,:lat)::geography,5000);-- 按距离排序SELECT*,geog<->ST_MakePoint(:lon,:lat)::geographyASdistFROMstoresORDERBYdistLIMIT10;

ES 的geo_distanceST_DWithin;按距离排序 ≈<->排序。


3. ES DSL

3.1 mapping + 写入

PUT stores_idx { "mappings": { "properties": { "name": { "type": "keyword" }, "location": { "type": "geo_point" } } } } POST stores_idx/_doc { "name": "Store-1", "location": { "lat": 39.9042, "lon": 116.4074 } }

3.2 geo_distance(N 公里内) + 按距离排序

GET stores_idx/_search { "query": { "bool": { "filter": { "geo_distance": { "distance": "5km", "location": { "lat": 39.9, "lon": 116.4 } } } } }, "sort": [ { "_geo_distance": { "location": { "lat": 39.9, "lon": 116.4 }, "order": "asc", "unit": "km" } } ] }

3.3 geo_bounding_box(矩形框内)

"query": { "geo_bounding_box": { "location": { "top_left": { "lat": 40.1, "lon": 116.2 }, "bottom_right": { "lat": 39.7, "lon": 116.6 } } } }

4. Spring Boot 实现

@ComponentpublicclassDoc50GeoQuery{@AutowiredprivateElasticsearchClientelasticsearchClient;/** 某点 radiusKm 公里内的门店,按距离升序 */publicList<Map<String,Object>>nearby(StringindexName,doublelat,doublelon,doubleradiusKm)throwsIOException{SearchResponse<Map>resp=elasticsearchClient.search(s->s.index(indexName).query(q->q.bool(b->b.filter(f->f.geoDistance(g->g.field("location").distance(radiusKm+"km").location(l->l.latlon(ll->ll.lat(lat).lon(lon))))))).sort(so->so.geoDistance(gd->gd.field("location").location(l->l.latlon(ll->ll.lat(lat).lon(lon))).order(SortOrder.Asc).unit(DistanceUnit.Kilometers))),Map.class);returnresp.hits().hits().stream().map(Hit::source).filter(Objects::nonNull).collect(Collectors.toList());}}

import:co.elastic.clients.elasticsearch._types.SortOrder...DistanceUnit
每个 hit 的距离在hit.sort()(对应_geo_distance排序值)里可取出。


5. 坑与最佳实践

  1. 经纬度顺序易错:GeoJSON 数组是[lon, lat],对象是{lat, lon}——别写反。
  2. geo_distancefilter:不需要打分,放 filter 更快、可缓存。
  3. 距离排序有成本:每命中文档都算距离,大结果集配合先用geo_distance过滤缩小范围。
  4. 精度 vs 性能geo_distancearc(精确)/plane(快、近距离够用)两种算法。
  5. 复杂形状用geo_shape:点用geo_point即可,多边形/围栏才上geo_shape

http://www.jsqmd.com/news/1329819/

相关文章:

  • 2026年烧结砖供应厂家哪家好?实际考察这三点就行 - 热点品牌推荐
  • UE5动画骨骼重定向:IK Rig从原理到实战,解决Mixamo到Metahuman适配难题
  • 巴彦淖尔CMA甲醛检测公司公共卫生检测怎么选:国慷测研CMA检测 - 信誉隆金银铂奢回收
  • 2026 年现阶段阿拉善盟本地冷库回收源头厂家联系电话,旧冷库变废为宝的隐形门道,90%的人都不知道它的价值能翻几番?-海韵玻璃冷库设备 - 企业推荐管【认证】
  • 2026年预制菜厂家**相关情况梳理汇总 - 奔跑123
  • 外贸新模式实战课程-更新5月,账号搭建+截流技术+AI矩阵+独家方法实现自动化获客
  • 想找咖啡烘豆机工厂哪家好?看完这篇就懂了 - 热点品牌推荐
  • APK Installer终极指南:在Windows上快速免费安装Android应用的完整教程
  • 2026 年黔江正规的二手电表回收厂家哪家**,旧电表竟还能卖钱?这背后藏着不少人不知道的门道-正兴电表回收 - 企业推荐官-
  • 2026 年富宁有实力的一体化预制泵站厂家推荐几家,别再傻傻花冤枉钱做泵站?这一体化预制方案省出半条工程经费-麓水环保玻璃钢化粪池 - 领域鉴赏官
  • 2026 年现阶段,贵池热门的专业打捞队捞手机批发厂家选哪家,为了一部手机花上千?看完打捞队操作,我果断给手机买了防掉落险 - 企业推荐管【认证】
  • 2026年B端企业招投标获客平台甄选指南:深度剖析、权威对比与避坑秘籍
  • 鹤壁CMA甲醛检测公司公共卫生检测怎么选:国慷测研CMA检测 - CMA甲醛检测中心
  • 国家中小学智慧教育平台电子课本下载终极指南:3分钟批量获取官方教材PDF
  • 2026 年现阶段,路桥可靠的玉镯断裂修复加工厂推荐,奶奶传了三代的镯子碎了,我咬着牙花了三百块,它竟能恢复成这样?-玉匠人玉镯无痕修复 - 鉴选官
  • 3分钟掌握Wand-Enhancer:完全免费解锁WeMod Pro功能终极指南
  • 2026 年新发布:延边知名的薄型通风器制造企业综合实力解析,住在20层楼还敢不装窗?难怪家里霉味重,原来这玩意儿才是通风隐形高手 - 行业推荐官-2
  • 石景山幼儿舞蹈启蒙门店找哪家?选对机构看这几点就对了 - 热点品牌推荐
  • 淄博保险纠纷维权实务参考:拒赔应对、条款审查与理赔落地要点 - 本地品牌推荐
  • 2026花都区粤菜餐厅哪家适合家庭聚?:【锦堂春想】欢聚优选 - 18002239949
  • 坚持每日浅阅读,慢慢积累文字感知力
  • 柔光砖哪里有卖?2026本地靠谱经销商**指南 - 奔跑123
  • 2026 年至今,武义到阿拉山口点对点直达运输公司哪家靠谱,跨境货主不用再绕路折腾,这运输方式到底藏着怎样的效率密码? - 品质体验官
  • 2026年标讯对接平台全品类盘点:如何选合规靠谱的招投标数据服务商?附选型避坑指南及优质服务商推荐
  • Python+Pygame实战:手把手教你打造简易第一人称射击游戏
  • 随州MA甲醛检测公司公共卫生检测如何选:安鑫母婴甲醛检测标准、流程、避坑指南 - 信誉隆金银铂奢回收
  • 2026年8月评价高的实木全屋定制服务商性价比** - 奔跑123
  • 计算机毕业设计之基于Spring Boot的智慧文旅平台的设计
  • 2026 年新消息:宣城本地梅花鹿租赁基地找哪家,婚礼秀场的吸睛杀器,这玩意儿比鲜花还抢镜? - 企业推荐官【认证】
  • 2026 年当下,安顺值得关注的篮球场护栏源头厂家推荐,你天天路过的这玩意儿,原来还藏着你不知道的小秘密? - 企业推荐官【认证】