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

来源:互联网 发布:在线报名系统 php 编辑:程序博客网 时间:2024/06/02 09:33

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

一.创建geo的mapping

{  "properties": {  --商品名称    "goodName": {      "type": "string",      "index_analyzer": "ik",      "search_analyzer": "ik"    },    --GPS    "location": {      "type": "geo_point"    }}

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


二.存放值到ES中。

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


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

public void getGEO(String geoName,double lat,double lon){SearchRequestBuilder srb = client.prepareSearch(essp.getIndexName()).setTypes(essp.getTypeName());//这个是查询出附近东西。GeoDistanceFilterBuilder fb = FilterBuilders.geoDistanceFilter(geoName).point(lat, lon).distance(2, DistanceUnit.KILOMETERS)// KILOMETERS为空里的意思。2公里附近的数据.optimizeBbox("memory") // Can be also "indexed" or "none".geoDistance(GeoDistance.ARC);srb.setPostFilter(fb);//获取距离多少公里 这个才是获取点与点之间的距离的GeoDistanceSortBuilder sort  = new GeoDistanceSortBuilder(geoName);sort.unit(DistanceUnit.KILOMETERS);sort.order(SortOrder.ASC);sort.point(lat, lon);sort.geoDistance(GeoDistance.ARC);srb.addSort(sort);SearchResponse searchResponse = srb.execute().actionGet();for (SearchHit hit : searchResponse.getHits().getHits()) {//获取距离值,并保留两位小数点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(hit.getSource());}}
如果不用计算点于点的距离。怎不将sort放入到srb中  就可以了。OK 大致上就这样了。有不明白的  留言吧。。。

0 0
原创粉丝点击