热卖商品
新闻详情
Elasticsearch地理坐标类型(Geo-point)在Spring Data E..._CSDN博客
来自 : CSDN技术社区
发布时间:2021-03-24
下文整理的几个问答 本人在实际应用中亲身经历或解决过的 主要涉及Elasticsearch地理坐标类型(Geo-point)在Java应用中的一些特殊使用场景 核心依赖如下
dependency groupId org.springframework.boot /groupId artifactId spring-boot-starter-data-elasticsearch /artifactId /dependencyA1. 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接口来实现上述功能 参考如下
Servicepublic 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的使用
Servicepublic 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());
如果这对您有帮助 欢迎分享和点赞 转载请注明出处
本文链接: http://geointer.immuno-online.com/view-713666.html
发布于 : 2021-03-24
阅读(0)
最新动态
2021-03-24
2021-03-24
2021-03-24
2021-03-24
2021-03-24
2021-03-24
2021-03-24
2021-03-24
2021-03-24
2021-03-24
2021-03-24
2021-03-24
品牌分类
其他
联络我们