Elasticsearch地理坐标类型(Geo-point)在Spring Data ES中的常见使用问题整理解答
时间:2022-06-11
本文章向大家介绍Elasticsearch地理坐标类型(Geo-point)在Spring Data ES中的常见使用问题整理解答,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
下文整理的几个问答,本人在实际应用中亲身经历或解决过的,主要涉及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>
来简化完成相关查询;
ElasticsearchRepository
实现以某点为中心并搜索指定范围,首先定义如下:
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
类中定义了相关的计算方法,参考如下:
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());
}
}
如果这对您有帮助,欢迎分享和点赞,转载请注明出处!
- onclicklistener到底怎么用?
- 如何入侵联网智能灯泡——LIFX智能灯泡
- Java实现的一个编号生成器工具类——5种方法
- 【机器学习】有趣的机器学习:最简明入门指南
- 不使用反射,“一行代码”实现Web、WinForm窗体表单数据的填充、收集、清除,和到数据库的CRUD
- 海量数据处理利器之布隆过滤器
- ORM查询语言(OQL)简介--概念篇
- Discuz! 任意文件删除漏洞重现及分析
- .NET DLR 上的IronScheme 语言互操作&&IronScheme控制台输入中文的问题
- Java中Map相关的6大问题——每个开发人员都要注意
- android service 学习(下)
- 混淆漏洞CVE-2017-0213技术分析
- android service 学习(上)
- 黑帽SEO剖析之隐身篇
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释