Spring ElasticsearchTemplate 经纬度按距离排序详解编程语言

es实体,用 @GeoPointField 注解,值为:中间逗号隔开,如 29.477000,119.278536(经度, 维度)

@Document(indexName = "v_intelligent_store") 
@Data 
public class IntelligentStore implements Serializable { 
  private String id; 
 
  /** 体验店名称 */ 
  private String name; 
  /** 联系人姓名 */ 
  private String contactsName; 
  /** 联系手机号 */ 
  private String phoneNumber; 
  /** 联系电话 */ 
  private String telePhone; 
  /** 场景分类 */ 
  private String category; 
  /** 开店时间 */ 
  private LocalDate foundTime; 
  /** 营业时间 */ 
  private String openHours; 
  /** 主营产品 */ 
  private String mainProduct; 
  /** 店铺面积 */ 
  private Double shopSize; 
  /** xx省xx市xx区 */ 
  private String area; 
  /** 店铺面积 */ 
  private String detailAddress; 
  /** 经维度,中间逗号隔开 */ 
  @GeoPointField private String location; 
  ...   
}

接口:

/** 
   * 搜索附近的体验店 
   * 
   * @param lat 经度 
   * @param lon 维度 
   * @param distance 距离 
   * @param pageable 
   * @return 
   */ 
  Page<IntelligentStoreDTO> findAllByLocaltion( 
      double lat, double lon, double distance, Pageable pageable);

实现:

@Override 
  public Page<IntelligentStoreDTO> findAllByLocaltion( 
      double lat, double lon, double distance, Pageable pageable) { 
 
    GeoDistanceQueryBuilder builder = 
        QueryBuilders.geoDistanceQuery("location")//查询字段 
            .point(lat, lon)//设置经纬度 
            .distance(distance, DistanceUnit.METERS)//设置距离和单位(米) 
            .geoDistance(GeoDistance.ARC); 
    GeoDistanceSortBuilder sortBuilder = 
        SortBuilders.geoDistanceSort("location") 
            .point(lat, lon) 
            .unit(DistanceUnit.METERS) 
            .order(SortOrder.ASC);//排序方式 
    //构造查询条件 
    NativeSearchQueryBuilder nativeSearchQueryBuilder = 
        new NativeSearchQueryBuilder() 
            .withFilter(builder) 
            .withSort(sortBuilder) 
            .withPageable(pageable); 
 
    Page<IntelligentStoreDTO> page = 
        elasticsearchTemplate.queryForPage( 
            nativeSearchQueryBuilder.build(), IntelligentStoreDTO.class); 
    return page; 
  }

查询10公里范围数据,返回:

{ 
  "code": "0", 
  "msg": "成功", 
  "result": [ 
    { 
      "id": "5af2c615e15b402c54c390b9", 
      "name": "智哪儿体验店1", 
      "area": "浙江省杭州市余杭区", 
      "detailAddress": "梦想小镇", 
      "location": "30.292227,120.004870", 
      "distance": "13", //距离目标位置多少米 
      "createTime": "2018-05-09 17:57:41", 
      "updateTime": "2018-05-09 17:57:41" 
    }, 
    { 
      "id": "5af2c62ce15b402c54c390bc", 
      "name": "智哪儿体验店3", 
      "area": "浙江省杭州市余杭区", 
      "detailAddress": "仓前工业园", 
      "location": "30.282905,119.987661", 
      "distance": "1962",//距离目标位置多少米 
      "createTime": "2018-05-09 17:58:04", 
      "updateTime": "2018-05-09 17:58:04" 
    }, 
    { 
      "id": "5af2c61fe15b402c54c390ba", 
      "name": "智哪儿体验店1", 
      "area": "浙江省杭州市余杭区", 
      "detailAddress": "中国移动杭州研发中心", 
      "location": "30.316513,120.021278", 
      "distance": "3111",//距离目标位置多少米 
      "createTime": "2018-05-09 17:57:51", 
      "updateTime": "2018-05-09 17:57:51" 
    }, 
    { 
      "id": "5af2c626e15b402c54c390bb", 
      "name": "智哪儿体验店2", 
      "area": "浙江省杭州市余杭区", 
      "detailAddress": "杭州师范大学", 
      "location": "30.241073,119.949798", 
      "distance": "7774",//距离目标位置多少米 
      "createTime": "2018-05-09 17:57:58", 
      "updateTime": "2018-05-09 17:57:58" 
    }, 
    { 
      "id": "5b0fbe41d601800007db438c", 
      "name": "社会主义学院智能锁店", 
      "contactsName": "健康的风景", 
      "area": "浙江省杭州市余杭区", 
      "detailAddress": "浙江省社会主义学院", 
      "location": "30.291823,120.138587", 
      "distance": "12818",//距离目标位置多少米 
      "createTime": "2018-05-31 17:20:01", 
      "updateTime": "2018-05-31 17:21:06" 
    } 
  ] 
}

 

原创文章,作者:Maggie-Hunter,如若转载,请注明出处:https://blog.ytso.com/16943.html

(0)
上一篇 2021年7月19日
下一篇 2021年7月19日

相关推荐

发表回复

登录后才能评论