ElasticSearchTemplate实现给定经纬度的“离我最近”排序/按距离排序
按步骤来吧。
第一步,准备要使用此排序方式的、要存入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里面的,这个没有死规定,可以自行定义。
这样就完成了“离我最近”的排序。
共有 0 条评论