主要是先设一下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
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
// 实现了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
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+"公里");
});
}