Elasticsearch地理坐标类型(Geo-point)在Spring Data ES中的常见使用问题整理解答
2018-09-12 23:01
519 查看
版权声明:欢迎关注我的个人公众号:超级码里奥。如果这对您有帮助,欢迎点赞和分享,转载请注明出处 https://blog.csdn.net/qq_28804275/article/details/82670025
A1. elasticsearch的
下文整理的几个问答,本人在实际应用中亲身经历或解决过的,主要涉及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()); } }
阅读更多如果这对您有帮助,欢迎分享和点赞,转载请注明出处!
相关文章推荐
- elasticsearch 中geo point地理位置数据类型
- 指针使用常见问题的解答与求教系列(1)
- 三星galaxy III I9300部分常见问题与解答 ,以及使用技巧!
- thrift rpc 使用常见问题解答和经验
- 【jBox】 2.3 beta版 多功能jQuery对话框插件下载及常见使用问题解答
- 玩转数据恢复之R-Studio的使用常见问题解答
- 在jdk1.7下使用spring的注解形式定义pointcut的问题
- [推荐] CSS图片垂直居中方法整理集合 !(常见问题解答)
- VS2010使用常见问题整理
- 使用 spring data jpa 时,单向OnetoOne问题
- Maven使用中的常见问题整理
- 使用ASP编程常见问题解答
- 使用Spring发送邮件常见问题汇总
- 永中Office用户使用中常见问题与解答
- CORBA Programming with TAO - 3.IDL Data Type(数据类型与Mapping)例子常见问题篇
- jBox 2.3基于jquery的最新多功能对话框插件 常见使用问题解答
- Maven使用中的常见问题整理
- DW使用中的常见问题与解答
- [网站帮助] 51aspx源码使用常见问题及解答(三十六计)
- 【jBox】2.3正式版 多功能jQuery对话框插件下载及常见使用问题解答