前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Elasticsearch地理坐标类型(Geo-point)在Spring Data ES中的常见使用问题整理解答

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

作者头像
happyJared
发布2018-09-20 09:44:10
3.1K0
发布2018-09-20 09:44:10
举报
文章被收录于专栏:happyJaredhappyJared

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

代码语言:javascript
复制
        <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包下的。

代码语言:javascript
复制
    /**
     * 坐标位置
     */
    @GeoPointField
    private GeoPoint location;
A2. spring data elasticsearch中,如何以某坐标点为中心搜索指定范围的其它点?

Q2. 建议尽可能通过继承ElasticsearchRepository<T, ID extends Serializable>来简化完成相关查询;

ElasticsearchRepository

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

代码语言:javascript
复制
public interface TestRepository extends ElasticsearchRepository<Test, String> {
}

  其次可通过QueryBuilder接口来实现上述功能,参考如下:

代码语言:javascript
复制
@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

代码语言:javascript
复制
    // 计算两点距离
    double distance = GeoDistance.ARC.calculate(srcLat, srcLon, dstLat, dstLon, DistanceUnit.KILOMETERS);

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

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

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

代码语言:javascript
复制
@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());
    }
    
}

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018.09.12 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • A1. elasticsearch的geo_point类型对应java中的哪种数据类型?
  • A2. spring data elasticsearch中,如何以某坐标点为中心搜索指定范围的其它点?
  • A3. spring data elasticsearch中,如何计算两个给定坐标点之间的距离?
  • A4. spring data elasticsearch应用中,如何以某个坐标点为中心,按距离近远排序搜索指定范围?
相关产品与服务
Elasticsearch Service
腾讯云 Elasticsearch Service(ES)是云端全托管海量数据检索分析服务,拥有高性能自研内核,集成X-Pack。ES 支持通过自治索引、存算分离、集群巡检等特性轻松管理集群,也支持免运维、自动弹性、按需使用的 Serverless 模式。使用 ES 您可以高效构建信息检索、日志分析、运维监控等服务,它独特的向量检索还可助您构建基于语义、图像的AI深度应用。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档