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里面的,这个没有死规定,可以自行定义。

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


猜你喜欢

转载自blog.csdn.net/qq_34972627/article/details/80282605