美文网首页
Elasticsearch 地理坐标类型 (Geo-point)

Elasticsearch 地理坐标类型 (Geo-point)

作者: happyJared | 来源:发表于2019-12-21 14:45 被阅读0次

      下文整理的几个问答,本人在实际应用中亲身经历或解决过的,主要涉及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.ARCGeoDistance.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) 在 Spring Data ES 中的常见使用问题整理解答

    相关文章

      网友评论

          本文标题:Elasticsearch 地理坐标类型 (Geo-point)

          本文链接:https://www.haomeiwen.com/subject/qervgctx.html