zoukankan      html  css  js  c++  java
  • 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();
        }
  • 相关阅读:
    在子线程中更新ProgressBar为null
    有关ContentProvider及相关一系列的简单用法(持续添加)
    Android内容提供者使用及创建
    Android中关于时间的操作
    Cell的一些坑: UITableViewCell宽度,在iphone5的时候是320,在iphone6的时候为啥也是320?
    处理数据源(根据条目字数多少 ,动态显示一行里有多少个条目,类似天猫搜索历史)
    iOS开发之如何跳到系统设置里的各种设置界面
    Block作为property属性实现页面之间传值(代替Delegate代理与协议结合的方法)
    xcode7的那些坑-“Your binary is not optimized for iPhone 5” (ITMS-90096) when submitting
    PresentViewController切换界面(一些系统自带的页面切换动画)
  • 原文地址:https://www.cnblogs.com/ywjfx/p/13538373.html
Copyright © 2011-2022 走看看