一、查询多边形的地理位置范围
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;
}
}