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

Elasticsearch-多边形范围查询(8.x)

目录

一、字段设计

二、数据录入

三、查询语句

四、Java代码实现


开发版本详见:Elasticsearch-经纬度查询(8.x-半径查询)_es经纬度范围查询-CSDN博客

一、字段设计

PUT /aoi_points
{"mappings": {"properties": {"location": {"type": "geo_shape"}}}
}

aoi_points是索引名称,location是字段名称,它将存储地理形状数据

二、数据录入

POST /aoi_points/_doc
{"location": {"type": "point","coordinates": [-74.0060, 40.7128]}
}

三、查询语句

GET /aoi_points/_search
{"query": {"bool": {"filter": {"geo_shape": {"location": {"shape": {"type": "polygon","coordinates": [[[-74.02, 40.715],[-73.99, 40.715],[-73.99, 40.705],[-74.02, 40.705],[-74.02, 40.715]]]},"relation": "within"}}}}}
}
  • location是存储地理位置的字段
  • shape定义了一个多边形区域,coordinates是一个数组,包含多边形顶点的坐标
  • relation指定了查询的地理空间关系,这里是within,表示查询多边形内部的点
  • 多边形的坐标点需要按顺序(通常是顺时针或逆时针)排列,形成一个闭合的多边形

四、Java代码实现

具体查询对象,可自行定义,本方法只提供思路,莫直接粘贴使用

        // 封装ES查询参数BoolQuery.Builder boolQueryBuilder = new BoolQuery.Builder();// AOI范围查询ShapePO shapePo =new ShapePO().setType(GeographyType.POLYGON.getValue()).setCoordinates(poi.getAoi().getCoordinates());// 多边形查询GeoShapeQuery geoShapeQuery =GeoShapeQuery.of(geoShape -> geoShape.field(PoiIndexConstant.LOCATION).shape(s -> s.shape(JsonData.fromJson(JSONUtil.toJsonStr(shapePo))).relation(GeoShapeRelation.Within)))._toQuery().geoShape();boolQueryBuilder.filter(f -> f.geoShape(geoShapeQuery));int size = poi.getAoi().getCoordinates().get(0).size();SearchRequest.Builder searchRequestBuilder = new SearchRequest.Builder();searchRequestBuilder.index(esIndexProperties.getPoiIndexRead()).query(query -> query.bool(boolQueryBuilder.build())).size(size);// ES查询SearchRequest searchRequest = searchRequestBuilder.build();log.info("getSmallAttractionByPoiId query:{}", searchRequest.toString());SearchResponse<PoiIndex> searchResponse = esUtil.queryDocument(searchRequest, PoiIndex.class);if (searchResponse.hits().hits().isEmpty()) {return List.of();}List<SmallAttractionDTO> smallAttractionDtoList = new ArrayList<>();for (Hit<PoiIndex> hit : searchResponse.hits().hits()) {// 业务处理}

相关文章:

  • Msql数据库之DDL(数据定义语言)的相关操作
  • Android11 设置一个默认密码 万能密码
  • 算法训练营day72
  • html超文本传输协议
  • 【Python】numpy:构建数组、数组属性、更改数组形状或维度、数组拷贝、数组合并、数组拆分、删除数组、数组保存到文件
  • python数据预处理工作记录
  • C++ Primer:3.6 多维数组
  • 人工智能前沿讲座——融合知识的自然语言处理
  • 用python写一个爬虫,爬取google中关于蛇的照片
  • OpenLayers学习笔记-点位聚合
  • python爬虫豆瓣电影TOP250
  • FakeNewsGPT4:通过知识增强的大规模视觉语言模型推进多模态假新闻检测
  • Python和C++骨髓细胞进化解析数学模型
  • prometheus+grafana应用监控配置
  • 基于springboot+vue+uniapp的超市购物系统小程序
  • python3.6+scrapy+mysql 爬虫实战
  • 2017前端实习生面试总结
  • dva中组件的懒加载
  • ECMAScript6(0):ES6简明参考手册
  • interface和setter,getter
  • javascript 总结(常用工具类的封装)
  • Joomla 2.x, 3.x useful code cheatsheet
  • JS进阶 - JS 、JS-Web-API与DOM、BOM
  • Linux中的硬链接与软链接
  • log4j2输出到kafka
  • markdown编辑器简评
  • PHP 小技巧
  • 湖南卫视:中国白领因网络偷菜成当代最寂寞的人?
  • 看完九篇字体系列的文章,你还觉得我是在说字体?
  • 理解IaaS, PaaS, SaaS等云模型 (Cloud Models)
  • 为物联网而生:高性能时间序列数据库HiTSDB商业化首发!
  • 用 Swift 编写面向协议的视图
  • 在electron中实现跨域请求,无需更改服务器端设置
  • RDS-Mysql 物理备份恢复到本地数据库上
  • ​Linux Ubuntu环境下使用docker构建spark运行环境(超级详细)
  • ###项目技术发展史
  • #前后端分离# 头条发布系统
  • #数据结构 笔记一
  • #我与Java虚拟机的故事#连载17:我的Java技术水平有了一个本质的提升
  • $con= MySQL有关填空题_2015年计算机二级考试《MySQL》提高练习题(10)
  • (done) NLP “bag-of-words“ 方法 (带有二元分类和多元分类两个例子)词袋模型、BoW
  • (Git) gitignore基础使用
  • (Pytorch框架)神经网络输出维度调试,做出我们自己的网络来!!(详细教程~)
  • (附源码)springboot工单管理系统 毕业设计 964158
  • (附源码)ssm基于微信小程序的疫苗管理系统 毕业设计 092354
  • (全注解开发)学习Spring-MVC的第三天
  • (十)Flink Table API 和 SQL 基本概念
  • (十八)SpringBoot之发送QQ邮件
  • (实战)静默dbca安装创建数据库 --参数说明+举例
  • (终章)[图像识别]13.OpenCV案例 自定义训练集分类器物体检测
  • ./include/caffe/util/cudnn.hpp: In function ‘const char* cudnnGetErrorString(cudnnStatus_t)’: ./incl
  • .NET 解决重复提交问题
  • .net 写了一个支持重试、熔断和超时策略的 HttpClient 实例池
  • .NET 中小心嵌套等待的 Task,它可能会耗尽你线程池的现有资源,出现类似死锁的情况
  • .Net(C#)自定义WinForm控件之小结篇