您的位置:首页 > 编程语言 > Java开发

Elasticsearch地理坐标类型(Geo-point)在Spring Data ES中的常见使用问题整理解答

2018-09-12 23:01 519 查看
版权声明:欢迎关注我的个人公众号:超级码里奥。如果这对您有帮助,欢迎点赞和分享,转载请注明出处 https://blog.csdn.net/qq_28804275/article/details/82670025

  下文整理的几个问答,本人在实际应用中亲身经历或解决过的,主要涉及Elasticsearch地理坐标类型(Geo-point)在Java应用中的一些特殊使用场景,核心依赖如下:

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>

A1. elasticsearch的
geo_point
类型对应java中的哪种数据类型?

Q1. spring data elasticsearch中定义了

GeoPoint
这个类来实现两者之间的类型映射,此外还需要为当前字段添加
@GeoPointField
注解进行标志,注意
GeoPoint
应该使用
org.springframework.data.elasticsearch.core.geo
包下的。

/**
* 坐标位置
*/
@GeoPointField
private GeoPoint location;

A2. spring data elasticsearch中,如何以某坐标点为中心搜索指定范围的其它点?

Q2. 建议尽可能通过继承

ElasticsearchRepository<T, ID extends Serializable>
来简化完成相关查询;

  实现以某点为中心并搜索指定范围,首先定义如下:

public interface TestRepository extends ElasticsearchRepository<Test, String> {
}

  其次可通过

QueryBuilder
接口来实现上述功能,参考如下:

@Service
public class TestService  {

@Resource
private TestRepository testRepository;

public Page<Test> findPage(double latitude, double longitude, String distance, Pageable pageable) {
// 间接实现了QueryBuilder接口
BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();

// 以某点为中心,搜索指定范围
GeoDistanceQueryBuilder distanceQueryBuilder = new GeoDistanceQueryBuilder("location");
distanceQueryBuilder.point(latitude, longitude);
// 定义查询单位:公里
distanceQueryBuilder.distance(distance, DistanceUnit.KILOMETERS);
boolQueryBuilder.filter(distanceQueryBuilder);

return testRepository.search(boolQueryBuilder, pageable);
}

}

A3. spring data elasticsearch中,如何计算两个给定坐标点之间的距离?

Q3. 在

GeoDistance
类中定义了相关的计算方法,参考如下:

// 计算两点距离
double distance = GeoDistance.ARC.calculate(srcLat, srcLon, dstLat, dstLon, DistanceUnit.KILOMETERS);

  关于

GeoDistance.ARC
GeoDistance.PLANE
,前者比后者计算起来要慢,但精确度要比后者高,具体区别可以看这里

A4. spring data elasticsearch应用中,如何以某个坐标点为中心,按距离近远排序搜索指定范围?

Q4. 通过

SearchQuery
来实现,参考下面这段代码中
GeoDistanceSortBuilder
的使用:

@Service
public class TestService  {

@Resource
private TestRepository testRepository;

public Page<Test> findPage(double latitude, double longitude, String 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", latitude, longitude);
distanceSortBuilder.unit(DistanceUnit.KILOMETERS);
distanceSortBuilder.order(SortOrder.ASC);
nativeSearchQueryBuilder.withSort(distanceSortBuilder);

return testRepository.search(nativeSearchQueryBuilder.build());
}

}

如果这对您有帮助,欢迎分享和点赞,转载请注明出处!

阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: