第一次写这博客,不知道能不能帮到别人。但最少在国内找这个点的资料还是比较少的。后续遇到有意思的也会写上去。在这里只写代码,原理就别问我了。没去研究源码,也说不出所以然来。好了 下面说整体。
一.创建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 大致上就这样了。有不明白的 留言吧。。。