Springboot整合ES地理位置查询
ES的地理位置查询
1、背景
店铺有实体类,在地图上搜索显示当前位置附近店铺,并显示距当前位置距离;当前位置由前端传参(经度与纬度)。
比如我们有很多的4s店,给用户一个app,在某个地方的时候,可以根据当前的地理位置搜索一下,自己附近的4s店。
(刚学会代码实现,做个笔记,原理和源码暂时没研究)
2、代码示例
/*** @description: 门店实体**/@Getter@Setter@Document(indexName = ESIndexAndType.INDEX_NAME)public class StoreES {@Idprivate String id;private String storeName;//经度private Double longitude;//纬度private Double latitude;private Boolean isdelete;//地址private String address;@GeoPointFieldprivate GeoPoint location;}/*** @Description:位置信息入参类**/@Getter@Setterpublic class LocationModel {//经度private Double longitude;//纬度private Double latitude;}/*** @description:店铺位置信息Dao层**/public interface StoreESRepository extends ElasticsearchRepository<StoreES, String> {}/*** @description: 附近门店查询**/public interface INearbyStoreService {PageResultVO nearbyStoreList(LocationModel locationModel, Integer page, Integer size);}/*** @description: 附近门店查询实现类**/@Servicepublic class NearByStoreServiceImpl implements INearbyStoreService {@Autowiredprivate StoreESRepository storeESRepository;public PageResultVO<List<NearbyStoreResultVO>> nearbyStoreList(LocationModel locationModel, Integer page, Integer size) {//分页Pageable pageInfo = PageRequest.of(page - 1, size);//查询条件构建SearchQuery storeNativeBuilder = getSearchQuery(locationModel, pageInfo);//查询并返回结果Page<StoreES> storeESPage = storeESRepository.search(storeNativeBuilder);List<NearbyStoreResultVO> nearbyStoreList = new ArrayList<>();storeESPage.getContent().forEach(store -> {String distance = "-";//坐标不为空时计算出距离(单位:km)if (!StringUtils.isEmpty(locationModel.getLatitude()) && !StringUtils.isEmpty(locationModel.getLongitude())) {//LocationUtils.getDistance,通过经纬度获得实际距离的方法,可百度distance = LocationUtils.getDistance(locationModel.getLatitude(), locationModel.getLongitude(),store.getLatitude(), store.getLongitude());}nearbyStoreList.add(new NearbyStoreResultVO(store.getStoreName(), store.getAddress(), store.getLongitude(),store.getLatitude(), distance));});return new PageResultVO<>(storeESPage.getTotalElements(), nearbyStoreList);}/*** @description: 入参条件查询构建**/private SearchQuery getSearchQuery(LocationModel locationModel, Pageable pageInfo) {BoolQueryBuilder storeBool = QueryBuilders.boolQuery();storeBool.must(storeBool.must(QueryBuilders.termQuery("isdelete", false)));//不为空查询经度与纬度storeBool.must(QueryBuilders.existsQuery("latitude"));storeBool.must(QueryBuilders.existsQuery("longitude"));//构建查询NativeSearchQueryBuilder storeNativeBuilder = new NativeSearchQueryBuilder();//调用地理位置查询构建方法if (!StringUtils.isEmpty(locationModel.getLatitude()) && !StringUtils.isEmpty(locationModel.getLongitude())) {getLocation(locationModel.getLatitude(), locationModel.getLongitude(), storeBool, storeNativeBuilder);}if (StringUtils.isEmpty(locationModel.getLatitude()) || StringUtils.isEmpty(locationModel.getLongitude())) {storeNativeBuilder.withSort(SortBuilders.fieldSort("storeName.keyword").order(SortOrder.DESC));}//构建完成return storeNativeBuilder.withQuery(storeBool).withPageable(pageInfo).build();}/*** @description: 地理位置查询条件构建**/private void getLocation(Double latitude, Double longitude, BoolQueryBuilder queryBool, NativeSearchQueryBuilder searchQueryBuilder) {// 以某点为中心,搜索指定范围GeoDistanceQueryBuilder distanceQueryBuilder = new GeoDistanceQueryBuilder("location");//指定从哪个位置搜索distanceQueryBuilder.point(latitude, longitude);//指定搜索多少km,distance可为自定义数值distanceQueryBuilder.distance(5/**distance*/, DistanceUnit.KILOMETERS);queryBool.filter(distanceQueryBuilder);// 按距离升序排列GeoDistanceSortBuilder distanceSortBuilder = new GeoDistanceSortBuilder("location", latitude, longitude);distanceSortBuilder.unit(DistanceUnit.KILOMETERS);distanceSortBuilder.order(SortOrder.ASC);searchQueryBuilder.withSort(distanceSortBuilder);}}
以上代码只是提供一种思路,工作中遇到问题的小总结。
Springboot整合ES地理位置查询相关推荐
- SpringBoot整合ES高级查询
SpringBoot整合ES高级查询 springboot版本:2.0.5.RELEASE elasticsearch版本:7.9.1 1.配置 引入依赖: <dependency>< ...
- ElasticSearch系列 - SpringBoot整合ES:短语匹配查询 match_phrase
文章目录 1. ElasticSearch match_phrase查询是什么?它与match查询有什么区别? 2. ElasticSearch match_phrase 查询的语法是什么? 3. E ...
- ElasticSearch系列 - SpringBoot整合ES:多个精确值查询 terms
文章目录 01. ElasticSearch terms 查询支持的数据类型 02. ElasticSearch term和 terms 查询的区别 03. ElasticSearch terms 查 ...
- 用SpringBoot整合ES数据库基础
一.SpringBoot整合ES数据库 1.配置原生的依赖. <properties><java.version>1.8</java.version><!-- ...
- ElasticSearch系列 - SpringBoot整合ES:分析器
文章目录 01. ElasticSearch 分析器 1. ElasticSearch match 文本搜索的过程? 2. ElasticSearch 分析器是什么? 3. ElasticSearch ...
- Springboot整合ES
本文来说下Springboot整合ES的实战部分 文章目录 概述 概述
- springboot整合es启动报错的问题
今天打算用springboot整合es创建一个索引并往索引里面写数据的时候,项目启动的时候一直报下面的这个错误,错误大概如下, Caused by: org.springframework.beans ...
- Springboot整合ES,ES版不一致
本文记录的是:在Springboot整合ES中遇到的一些事 问题描述 最近想要提升自己的能力(其实就是被逼无奈),去学习了Elasticsearch:官方分布式搜索和分析引擎,在学完基础知识后(其实就 ...
- SpringBoot整合es提示错误:ElasticsearchException[Invalid or missing build flavor [oss]]
文章目录 解析 修改版本 错误详情 SpringBoot整合es提示错误:ElasticsearchException[Invalid or missing build flavor [oss]] 解 ...
最新文章
- extjs2.0 ie8 下拉树_extjs自定义下拉树
- 专访香港大学罗平:师从汤晓鸥、王晓刚,最早将深度学习应用于计算机视觉的「先行者」
- [转] linux-Centos7安装python3并与python2共存
- Android从url不产生cookie,如何从android.webkit.CookieManager获取所有cookie或cookie的URL
- 7/100. Move Zeroes
- 计算机公共基础知识论文,计算机等级考试二级公共基础知识汇总.doc
- MyBatis全局配置文件和映射文件
- ELK学习总结(1)——我们为什么要用ELK
- MDaemon的邮件撤回功能详细介绍
- 手把手教你制作easyUI+bootstrap工作站,主要学习tabs方法
- 对数字信号处理中各种频率以及分辨率的理解
- 多个引用类型的变量“引用”同一个对象意味着什么
- cboard企业版源码_CBoard的部署与使用
- 3dmax如何拆分模型_3dmax怎么拆分模型画贴图
- 电台复活节_如何通过在控制台中隐藏复活节彩蛋使您的应用程序用户惊讶
- 基于stm32f10x(原子)的电容触摸实验的个人解读 (16)
- MSDC 4.3 接口规范(29)
- 解释:什么是CPC,CPA,CVR,CTR,ROI? 营销、广告、淘宝 术语
- Python代码画小鸭穿雨靴--turtle绘图
- MySQL报错问题:2509
热门文章
- ArcGIS Runtime SDK for Windows Phone 入门教程
- 冯宝丹:终究是一个人。
- 二级域名的子域名查看方法及工具
- CSDN Markdown 商标标志 C、TM、R
- 设计一个动物声音“模拟器”,希望模拟器可以模拟许多动物的叫声
- 【kettle】【报错】 Unexpected problem reading shared objects from XML file 当读共享文件时发生错误
- 社交电商模式优化之报单产品
- FinClip程序员生活指南|如何“反脆弱”的过好一个低碳生活
- 多多情报通:拼多多48小时发货怎么设置?最晚多久发货?
- Draemon 360开源的基于Promtheus的升级版本告警系统