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

首先给大家推荐一下我老师大神的人工智能教学网站。教学不仅零基础,通俗易懂,而且非常风趣幽默,还时不时有内涵黄段子!点这里可以跳转到网站

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

一.创建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 投票数
文章评分
订阅评论
提醒
0 评论
内联反馈
查看所有评论
0
希望看到您的想法,请发表评论。x
()
x