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地理位置查询相关推荐

  1. SpringBoot整合ES高级查询

    SpringBoot整合ES高级查询 springboot版本:2.0.5.RELEASE elasticsearch版本:7.9.1 1.配置 引入依赖: <dependency>< ...

  2. ElasticSearch系列 - SpringBoot整合ES:短语匹配查询 match_phrase

    文章目录 1. ElasticSearch match_phrase查询是什么?它与match查询有什么区别? 2. ElasticSearch match_phrase 查询的语法是什么? 3. E ...

  3. ElasticSearch系列 - SpringBoot整合ES:多个精确值查询 terms

    文章目录 01. ElasticSearch terms 查询支持的数据类型 02. ElasticSearch term和 terms 查询的区别 03. ElasticSearch terms 查 ...

  4. 用SpringBoot整合ES数据库基础

    一.SpringBoot整合ES数据库 1.配置原生的依赖. <properties><java.version>1.8</java.version><!-- ...

  5. ElasticSearch系列 - SpringBoot整合ES:分析器

    文章目录 01. ElasticSearch 分析器 1. ElasticSearch match 文本搜索的过程? 2. ElasticSearch 分析器是什么? 3. ElasticSearch ...

  6. Springboot整合ES

    本文来说下Springboot整合ES的实战部分 文章目录 概述 概述

  7. springboot整合es启动报错的问题

    今天打算用springboot整合es创建一个索引并往索引里面写数据的时候,项目启动的时候一直报下面的这个错误,错误大概如下, Caused by: org.springframework.beans ...

  8. Springboot整合ES,ES版不一致

    本文记录的是:在Springboot整合ES中遇到的一些事 问题描述 最近想要提升自己的能力(其实就是被逼无奈),去学习了Elasticsearch:官方分布式搜索和分析引擎,在学完基础知识后(其实就 ...

  9. SpringBoot整合es提示错误:ElasticsearchException[Invalid or missing build flavor [oss]]

    文章目录 解析 修改版本 错误详情 SpringBoot整合es提示错误:ElasticsearchException[Invalid or missing build flavor [oss]] 解 ...

最新文章

  1. extjs2.0 ie8 下拉树_extjs自定义下拉树
  2. 专访香港大学罗平:师从汤晓鸥、王晓刚,最早将深度学习应用于计算机视觉的「先行者」
  3. [转] linux-Centos7安装python3并与python2共存
  4. Android从url不产生cookie,如何从android.webkit.CookieManager获取所有cookie或cookie的URL
  5. 7/100. Move Zeroes
  6. 计算机公共基础知识论文,计算机等级考试二级公共基础知识汇总.doc
  7. MyBatis全局配置文件和映射文件
  8. ELK学习总结(1)——我们为什么要用ELK
  9. MDaemon的邮件撤回功能详细介绍
  10. 手把手教你制作easyUI+bootstrap工作站,主要学习tabs方法
  11. 对数字信号处理中各种频率以及分辨率的理解
  12. 多个引用类型的变量“引用”同一个对象意味着什么
  13. cboard企业版源码_CBoard的部署与使用
  14. 3dmax如何拆分模型_3dmax怎么拆分模型画贴图
  15. 电台复活节_如何通过在控制台中隐藏复活节彩蛋使您的应用程序用户惊讶
  16. 基于stm32f10x(原子)的电容触摸实验的个人解读 (16)
  17. MSDC 4.3 接口规范(29)
  18. 解释:什么是CPC,CPA,CVR,CTR,ROI? 营销、广告、淘宝 术语
  19. Python代码画小鸭穿雨靴--turtle绘图
  20. MySQL报错问题:2509

热门文章

  1. ArcGIS Runtime SDK for Windows Phone 入门教程
  2. 冯宝丹:终究是一个人。
  3. 二级域名的子域名查看方法及工具
  4. CSDN Markdown 商标标志 C、TM、R
  5. 设计一个动物声音“模拟器”,希望模拟器可以模拟许多动物的叫声
  6. 【kettle】【报错】 Unexpected problem reading shared objects from XML file 当读共享文件时发生错误
  7. 社交电商模式优化之报单产品
  8. FinClip程序员生活指南|如何“反脆弱”的过好一个低碳生活
  9. 多多情报通:拼多多48小时发货怎么设置?最晚多久发货?
  10. Draemon 360开源的基于Promtheus的升级版本告警系统