当前位置: 代码迷 >> 综合 >> ElasticSearchTemplate实现给定经纬度的“离我最近”排序/按距离排序
  详细解决方案

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

热度:36   发布时间:2023-10-24 08:54:50.0

按步骤来吧。

 

第一步,准备要使用此排序方式的、要存入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{@Idprivate Integer shopId;@GeoPointFieldprivate 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里面的,这个没有死规定,可以自行定义。

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


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

  相关解决方案