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