ES之geo_point 經緯度搜索


 

geoDistanceRangeQuery 圓形查詢
geoBoundingBoxQuery 矩形查詢
geoPolygonQuery 多邊形查詢

 

1、創建mapping

    //https://blog.csdn.net/wuzhiwei549/article/details/80537753
    @Test
    public void testSettingsMappingsGeo() throws IOException {
        //1:settings
        HashMap<String, Object> settings_map = new HashMap<String, Object>(2);
        settings_map.put("number_of_shards", 3);
        settings_map.put("number_of_replicas", 2);

        //2:mappings(映射、schema)
        XContentBuilder builder = XContentFactory.jsonBuilder()
                .startObject()
                .field("dynamic", "true")
                //設置type中的屬性
                .startObject("properties")
                //.startObject("pin")
               // .startObject("properties")
                .startObject("location")
                    .field("type","geo_point")
                .endObject()
               // .endObject()
               // .endObject()
                .endObject()
                .endObject();

        CreateIndexRequestBuilder prepareCreate = client.admin().indices().prepareCreate("carshop");
        //管理索引(user_info)然后關聯type(user)
        prepareCreate.setSettings(settings_map).addMapping("shop", builder).get();
    }

2、創建索引,添加數據

 @Test
    public void testCreateGeo() throws IOException {
        List<GeoPoint> points = new ArrayList<>();
        points.add(new GeoPoint(40.12, -71.34));
        IndexResponse response = client.prepareIndex("carshop", "shop", "2")
                .setSource(
                        jsonBuilder()
                                .startObject()
                                .field("name", "上海順豐寶馬4S店")
                                .field("location", points)
                                .endObject()
                ).get();
    }

3、基於經緯度搜索

 @Test
    public void testQueryGeo() throws IOException {
        //第一個需求:搜索兩個坐標點組成的一個區域
        SearchResponse searchResponse = client.prepareSearch("carshop")
                .setTypes("shop")
                .setQuery(QueryBuilders.geoBoundingBoxQuery("location")
                        .setCorners(40.73, -74.1, 40.01, -71.12))
                .get();

        for(SearchHit searchHit : searchResponse.getHits().getHits()) {
            System.out.println(searchHit.getSourceAsString());
        }
        System.out.println("======================================================");

        //第二個需求:指定一個區域,由三個坐標點,組成,比如上海大廈,東方明珠塔,上海火車站
        List<GeoPoint> points = new ArrayList<>();
        points.add(new GeoPoint(40.73, -74.1));
        points.add(new GeoPoint(40.01, -71.12));
        points.add(new GeoPoint(50.56, -90.58)); 
        searchResponse = client.prepareSearch("carshop")
                .setTypes("shop")
                .setQuery(QueryBuilders.geoPolygonQuery("location", points))
                .get();

        for(SearchHit searchHit : searchResponse.getHits().getHits()) {
            System.out.println(searchHit.getSourceAsString());
        }

        System.out.println("====================================================");

        //第三個需求:搜索距離當前位置在200公里內的4s店
        searchResponse = client.prepareSearch("carshop")
                .setTypes("shop")
                .setQuery(QueryBuilders.geoDistanceQuery("location")
                        .point(40, -70)
                        .distance(200, DistanceUnit.KILOMETERS))
                .get();

        for(SearchHit searchHit : searchResponse.getHits().getHits()) {
            System.out.println(searchHit.getSourceAsString());
        }

        client.close();
    }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM