import org.elasticsearch.action.search.SearchRequestBuilder; import org.elasticsearch.action.search.SearchResponse; import org.elasticsearch.client.Client; import org.elasticsearch.common.geo.GeoDistance; import org.elasticsearch.common.unit.DistanceUnit; import org.elasticsearch.index.query.QueryBuilder; import org.elasticsearch.index.query.QueryStringQueryBuilder; import org.elasticsearch.search.SearchHit; import org.elasticsearch.search.SearchHits; import org.elasticsearch.search.sort.GeoDistanceSortBuilder; import org.elasticsearch.search.sort.SortOrder; import java.math.BigDecimal; import java.util.Map; import java.util.concurrent.ExecutionException; import static org.elasticsearch.index.query.QueryBuilders.geoDistanceRangeQuery;
这里只是做个笔记,用elasticsearch获取附近的城市。// 模糊查询 public void query(Client client,String query,String index,String type) throws Exception { QueryStringQueryBuilder qsqb = new QueryStringQueryBuilder(query); // qsqb.analyzer("ik").field("title"); qsqb.field("title"); client.admin().indices().prepareRefresh().execute().actionGet(); SearchResponse searchResponse = client.prepareSearch(index).setTypes(type).setQuery(qsqb) // .setScroll(new TimeValue(60000)) .addFields("id", "title", "updatetime") // .addSort("updatetime", SortOrder.DESC) .addSort("_score", SortOrder.DESC) // .addHighlightedField("title") .setHighlighterEncoder("UTF-8").execute().actionGet(); // 搜索耗时 Float usetime = searchResponse.getTookInMillis() / 1000f; // 命中记录数 Long hits = searchResponse.getHits().totalHits(); System.out.println("查询到记录数=" + hits); for (SearchHit hit : searchResponse.getHits()) { // 打分 Float score = hit.getScore(); Integer id = Integer.parseInt(hit.getFields().get("id").value().toString()); String title = hit.getFields().get("title").value().toString(); System.out.println(title); } } // 获取附近的城市 public void getNearbyCities(Client client, String index, String type, double lat, double lon) throws ExecutionException, InterruptedException { SearchRequestBuilder srb = client.prepareSearch(index).setTypes(type); // srb.setPos // wx4g0th9p0gk 为北京的geohash 范围为lt(小于) 1500km内的数据 QueryBuilder builder = geoDistanceRangeQuery("location") .point(lat,lon)//注意纬度在前,经度在后 .from("0km") .to("10000km") .includeLower(true) .includeUpper(false) .optimizeBbox("memory") .geoDistance(GeoDistance.ARC); srb.setQuery(builder); // 获取距离多少公里 这个才是获取点与点之间的距离的 //GeoDistanceSortBuilder sort = SortBuilders.geoDistanceSort("location"); GeoDistanceSortBuilder sort = new GeoDistanceSortBuilder("location"); sort.unit(DistanceUnit.KILOMETERS);//距离单位公里 sort.order(SortOrder.ASC); sort.point(lat,lon);//注意纬度在前,经度在后 srb.addSort(sort); SearchResponse searchResponse = srb.execute().actionGet(); SearchHits hits = searchResponse.getHits(); SearchHit[] searchHists = hits.getHits(); System.out.println("北京附近的城市(" + hits.getTotalHits() + "个):"); for (SearchHit hit : searchHists) { String city = (String) hit.getSource().get("city"); String title = (String) hit.getSource().get("title"); // 获取距离值,并保留两位小数点 BigDecimal geoDis = new BigDecimal((Double) hit.getSortValues()[0]); Map<String, Object> hitMap = hit.getSource(); // 在创建MAPPING的时候,属性名的不可为geoDistance。 hitMap.put("geoDistance", geoDis.setScale(2, BigDecimal.ROUND_HALF_DOWN)); System.out.println(city + "距离北京" + hit.getSource().get("geoDistance") + DistanceUnit.KILOMETERS.toString() + "---" + title); } }
elasticsearch对地理坐标获取附近的城市
最新推荐文章于 2023-10-24 17:41:12 发布