springboo+elasticsearch+经纬度查询

主要是先设一下mapping,比如entity如下:

@Document(indexName = "buser",type = "person",shards = 1,replicas = 0,refreshInterval = "-1")
public class Driver {
    @Id
    private String id;
 
    @Field
    private String name;
 
    @Field
    private String phone;
 
    @Field
    private String openid;
 
   
 
    @GeoPointField
    private GeoPoint location;

 

其中location是地理位置,如果不手机设mapping是不生效的,查询出错,所以第一下设一个mapping,只要发送一个PUT请求就可以发,如下:

PUT http://48.107.130.55:9200/buser

{
  "mappings": {
    "person":{
      "properties":{
        "id":{
          "type":"String"
        },
        "name":{
          "type":"String"
        },
        "phone":{
          "type":"String"
        },
        "openid":{
          "type":"String"
        },
        "location":{
          "type":"geo_point"
        }
        
      }
    }
  }  
}

 

那怎发发送这个PUT呢,URL是多少了,其就是ELASTICSEARCH的仿问路径+/indexName(这里就是上面entity里设的,buser,比如elcaticsearch基本路径为http://48.107.130.55:9200,则为http://48.107.130.55:9200/buser,也就是向这个地址发一个put请求,请求的内容就是上面那个json数据,就这样就可以了。

 

 

下面是test写的测试内容,都是测试可用,当然可能还会和springboot的版本有关,我的版本是1.5.6.RELEASE

@Test
    public void tes2() {
        List employees = new ArrayList();
        for(int i =0;i<10;i++){
            Gonjiaoche employee = new Gonjiaoche();
            employee.setId("99"+i);
            employee.setName(i+"name");
            // 纬度,经度
            GeoPoint geoPoint = new GeoPoint(12.71+(i/10),13.25+(i/10));
            employee.setLocation(geoPoint);
            employees.add(employee);
        }
        gonjiaocheDao.save(employees);
    }
    
    /**
     * 地理搜索
     * @param latitude 纬度
     * @param longitude 经度
     * @param distance 距离
     * @param pageable 分页
     */
    public Page findPage(double latitude, double longitude, double distance, Pageable pageable) {
        // 实现了SearchQuery接口,用于组装QueryBuilder和SortBuilder以及Pageable等
        NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
        // 分页
        nativeSearchQueryBuilder.withPageable(pageable);
 
        // 间接实现了QueryBuilder接口
        BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();
        // 以某点为中心,搜索指定范围
        GeoDistanceQueryBuilder distanceQueryBuilder = new GeoDistanceQueryBuilder("location");
        distanceQueryBuilder.point(latitude, longitude);
        // 定义查询单位:公里
        distanceQueryBuilder.distance(distance, DistanceUnit.KILOMETERS);
        boolQueryBuilder.filter(distanceQueryBuilder);
        nativeSearchQueryBuilder.withQuery(boolQueryBuilder);
 
        // 按距离升序
        GeoDistanceSortBuilder distanceSortBuilder =new GeoDistanceSortBuilder("location");
        distanceSortBuilder.point(latitude, longitude);
                //new GeoDistanceSortBuilder("geo", latitude, longitude);
        distanceSortBuilder.unit(DistanceUnit.KILOMETERS);
        distanceSortBuilder.order(SortOrder.ASC);
        nativeSearchQueryBuilder.withSort(distanceSortBuilder);
 
        return driverDao.search(nativeSearchQueryBuilder.build());
    }

    @Test
    public void test2(){
       // Page page = findPage(11.71, 13.25, 50000000, new PageRequest(0, 50));
        
        Page page = findPage(23.255533, 113.207031, 50, new PageRequest(0, 50));
        System.out.println("开始搜索");
 
        page.forEach(emp->{
            System.out.println(emp.getName());
            // calculate() 可以点进去这个方法 看看 就明白每个字段代表什么意思 不懂的话评论
            double distance = GeoDistance.ARC.calculate(23.255533, 113.207031, emp.getLocation().getLat(),emp.getLocation().getLon(), DistanceUnit.KILOMETERS);
           System.out.println(emp+"; 距离我 : "+distance+"公里");
       });
 
 
    }

你可能感兴趣的:(spring)