1. 程式人生 > 實用技巧 >ES之geo_point 經緯度搜索

ES之geo_point 經緯度搜索

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();
    }