当前位置: 代码迷 >> 综合 >> elasticsearch6.3.2学习记录三 《geo 地理位置空间查询》
  详细解决方案

elasticsearch6.3.2学习记录三 《geo 地理位置空间查询》

热度:17   发布时间:2023-12-22 12:42:37.0

一、查询多边形的地理位置范围


public String ploygeoSearch(@RequestBody Object json) {TransportClient client;try {/**List list = JSONObject.fromObject(json).getJSONArray("list");String keyword = JSONObject.fromObject(json).getString("keyVal");//指定一个区域,由三个或以上坐标点组成List<GeoPoint> points = new ArrayList<>();for (int i=0;i<list.size();i++){String pointStr = list.get(i).toString();String wkt = pointStr.substring(1,pointStr.length()-1);String[] point = wkt.split(",");double lat = Double.parseDouble(point[0])/1000.0;double lon = Double.parseDouble(point[1])/1000.0;if (lat>90) lat=90.000000;if (lat<-90) lat = -90.000000;if (lon>180) lon = 180.000000;if (lon<-180) lon = -180.000000;points.add(new GeoPoint(lat, lon));}**/List<GeoPoint> points = new ArrayList<>();//纬度,经度points.add(new GeoPoint(21.01, 23.10));//纬度,经度points.add(new GeoPoint(25.01, 53.10));points.add(new GeoPoint(41.01, 43.10));GeoPolygonQueryBuilder gpqb = QueryBuilders.geoPolygonQuery("pin.location", points);//多条件设置QueryBuilder queryBuilder = null;MatchPhraseQueryBuilder mpqb = null;if (!"".equals(keyword)){mpqb = QueryBuilders.matchPhraseQuery("DISTRICT",keyword);queryBuilder = QueryBuilders.boolQuery().must(mpqb).must(gpqb);}else {
   //如果没有输入关键字 只进行区域范围查询 queryBuilder = QueryBuilders.boolQuery().must(gpqb);}client = EsUtil.getClient();SearchResponse searchResponse = client.prepareSearch(indexName).setTypes(indexType).setSize(Integer.parseInt(searchSize)).setQuery(queryBuilder).get();long totalHits = searchResponse.getHits().totalHits;//命中个数SearchHit[] searchHits = searchResponse.getHits().getHits(); //执行检索//返回结果List result = new ArrayList();for (int i = 0; i < searchHits.length; i++) {result.add(JSONObject.fromObject(searchHits[i].getSourceAsString()));}return result.toString();}catch (Exception e){e.printStackTrace();return "检索失败";}}/*** 获取客户端* @return*/public static TransportClient getClient() {try {TransportClient client;Settings esSettings = Settings.builder().put("cluster.name", "elasticsearch") //设置ES实例的名称.put("client.transport.sniff", true) //自动嗅探整个集群的状态,把集群中其他ES节点的ip添加到本地的客户端列表中.put("client.transport.ignore_cluster_name", true)  //如果集群名不对,也能连接.build();client = new PreBuiltTransportClient(esSettings);//初始化client较老版本发生了变化,此方法有几个重载方法,初始化插件等。//此步骤添加IP,至少一个,其实一个就够了,因为添加了自动嗅探配置client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));return client;} catch (Exception e) {e.printStackTrace();return null;}}

二、参考 Elasticsearch Java API 的使用(7)—多条件查询