ElasticSearchTemplate实现给定经纬度的“离我最近”排序/按距离排序 您所在的位置:网站首页 离我最近的民宿推荐一个地方 ElasticSearchTemplate实现给定经纬度的“离我最近”排序/按距离排序

ElasticSearchTemplate实现给定经纬度的“离我最近”排序/按距离排序

2023-07-16 23:11| 来源: 网络整理| 查看: 265

按步骤来吧。

 

第一步,准备要使用此排序方式的、要存入ES的Bean,添加位置信息属性,并加 @GeoPointField 。位置属性的类型为GeoPoint。正常情况下应该是用SpringData包下的GeoPoint类型,但是使用期间会出现各种无法判断的错误,所以我们一般自己创建一个GeoPoint类,这个类需要有lat(纬度)和lon(经度)这两个属性、两个构造器(空参、全参),和属性的getter setter。

// 自己创建的GeoPoint public class GeoPoint { private Double lat, lon; public GeoPoint() { } public GeoPoint(Double lat, Double lon) { this.lat = lat; this.lon = lon; } public Double getLat() { return lat; } public void setLat(Double lat) { this.lat = lat; } public Double getLon() { return lon; } public void setLon(Double lon) { this.lon = lon; } } // 要排序的JavaBean public class Shop{ @Id private Integer shopId; @GeoPointField private GeoPoint position; } //多余的就不写了

第二步就是把对象存到ElasticSearch中,这篇文章仅针对“离我最近”排序,如何存入不再赘述。存入之后,在Kibana中看到的位置信息是这样显示的:

"shopId":201805111234567, "position":{ "lat":40.123, "lon":-70.456 }

第三步,就是排序并查询了,代码如下:

NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder().withQuery(boolQueryBuilder).withPageable(pageable); if (null != searchParams.getSortType() && SortTypeConstants.DISTANCE.getCode() == searchParams.getSortType()) { GeoDistanceSortBuilder sortBuilder = SortBuilders.geoDistanceSort("position", "") .point(searchParams.getLat(), searchParams.getLon()) .unit(DistanceUnit.METERS) .order(SortOrder.ASC); nativeSearchQueryBuilder.withSort(sortBuilder); } SearchQuery searchQuery = nativeSearchQueryBuilder.build();

boolQueryBuilder在前面创建好的,用来拼接筛选条件,我的其它文章有介绍。按距离排序需要创建NativeSearchQueryBuilder,然后.withSort()就可以了。

经纬度和排序类型都是放在searchParams里面的,这个没有死规定,可以自行定义。

这样就完成了“离我最近”的排序。

喜欢本文的朋友不要忘记点一个免费的赞哦,你的赞将是我最大的动力。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有