elasticsearch获取geo的点点之间的距离(distance)

第一次写这博客,不知道能不能帮到别人。但最少在国内找这个点的资料还是比较少的。后续遇到有意思的也会写上去。在这里只写代码,原理就别问我了。没去研究源码,也说不出所以然来。好了 下面说整体。

一.创建geo的mapping

[html]  view plain  copy
  1. {  
  2.   "properties": {  
  3.     --商品名称  
  4.     "goodName": {  
  5.       "type": "string",  
  6.       "index_analyzer": "ik",  
  7.       "search_analyzer": "ik"  
  8.     },  
  9.     --GPS  
  10.     "location": {  
  11.       "type": "geo_point"  
  12.     }  
  13. }  

要使用经纬度的字段 就必须试用type为geo_point。这个要注意下。如果打算直接用的话。注意 删了注释


二.存放值到ES中。

[java]  view plain  copy
  1. IndexRequestBuilder irb = client.prepareIndex(indexName,  
  2.                         typeName, 1);  
  3. XContentBuilder xb = XContentFactory.jsonBuilder()  
  4.                         .startObject();  
  5. //这里的infoMap是一个map 其中含有key值对应之前的mapping key就行了。  
  6. Iterator it = infoMap.keySet().iterator();  
  7. while (it.hasNext()) {  
  8. //经纬度的值必须是double类型的,我这里用了double数组类型的。  
  9. String key = (String) it.next();  
  10. if (infoMap.get(key) instanceof double[]) {  
  11.     double[] dolatlon = (double[]) infoMap.get(key);  
  12.     xb.latlon(key, dolatlon[0], dolatlon[1]);  
  13. }else{  
  14.     xb.field(key, infoMap.get(key));  
  15. }  
  16. xb.endObject();  
  17. irb.setSource(xb);  
  18. BulkResponse bulkResponse = brb.execute().actionGet();  
执行完后,可以在去head里看下  是否添加成功。


三.查询出附近的数据,以及查询之间的距离

[html]  view plain  copy
  1. public void getGEO(String geoName,double lat,double lon){     
  2.     SearchRequestBuilder srb = client.prepareSearch(essp.getIndexName())  
  3.             .setTypes(essp.getTypeName());  
  4.     //这个是查询出附近东西。  
  5.     GeoDistanceFilterBuilder fb = FilterBuilders  
  6.             .geoDistanceFilter(geoName)  
  7.             .point(lat, lon)  
  8.             .distance(2, DistanceUnit.KILOMETERS)// KILOMETERS为空里的意思。2公里附近的数据  
  9.             .optimizeBbox("memory") // Can be also "indexed" or "none"  
  10.             .geoDistance(GeoDistance.ARC);  
  11.   
  12.     srb.setPostFilter(fb);  
  13.   
  14.           
  15.     //获取距离多少公里 这个才是获取点与点之间的距离的  
  16.     GeoDistanceSortBuilder sort  = new GeoDistanceSortBuilder(geoName);  
  17.     sort.unit(DistanceUnit.KILOMETERS);  
  18.     sort.order(SortOrder.ASC);  
  19.     sort.point(lat, lon);  
  20.     sort.geoDistance(GeoDistance.ARC);  
  21.   
  22.     srb.addSort(sort);  
  23.     SearchResponse searchResponse = srb.execute().actionGet();  
  24.   
  25.     for (SearchHit hit : searchResponse.getHits().getHits()) {  
  26.                   
  27.                 //获取距离值,并保留两位小数点  
  28.                 BigDecimal geoDis=new BigDecimal((double)hit.getSortValues()[0]);  
  29.                 Map<String,Object> hitMap=hit.getSource();  
  30.                 //在创建MAPPING的时候,属性名的不可为geoDistance。  
  31.                 hitMap.put("geoDistance", geoDis.setScale(2, BigDecimal.ROUND_HALF_DOWN));  
  32.                   
  33.                 System.out.println(hit.getSource());  
  34.                   
  35.     }  
  36.   
  37. }  
如果不用计算点于点的距离。怎不将sort放入到srb中  就可以了。OK 大致上就这样了。有不明白的  留言吧。。。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值