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 大致上就这样了。有不明白的  留言吧。。。


  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值