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
- elasticsearch获取geo的点点之间的距离(distance)
- 获取经纬度之间的距离
- 获取两点之间的距离
- edit distance---计算2个单词之间的距离
- LeetCode—**Edit Distance 计算两个字符串之间的距离
- C++实现两个字符串之间的Levenshtein Distance(编辑距离)
- 如何获取两个算子之间的距离
- 获取当前位置,计算两点之间的距离
- php获取两经纬度之间的距离
- php获取两点经纬度之间的距离
- elasticsearch 全文检索,geo地理位置附近的人查询
- Elasticsearch geo 地理查询容易掉入的坑
- PAT (Advanced Level) 1046. Shortest Distance (20) 求环中两点之间的距离
- [leetcode, python] Total Hamming Distance 多个数字之间的汉明距离
- feature的距离度量distance measure
- 两字符串的编辑距离 (Eidt Distance)
- 获取经纬度之间的距离的SQL函数(转)
- 数组之间的距离
- ArcEngine “不能再打开其他表了”
- 第三章第39题
- PDF文本转换成Word有什么好方法
- 点击添加,jsp页面表格自动添加一行
- shouldOverrideUrlLoading()重定向,无法返回跳出WebView的问题
- elasticsearch获取geo的点点之间的距离(distance)
- LeetCode中的Isomorphic Strings 的java实现
- MFC——ComBox用法大全
- 阿里巴巴Dubbo实现的源码分析
- c++学习(1)--explicit
- tar 基本操作
- Count and Say
- JVM -XX: 参数介绍
- 对人脸检测训练样本如何生成正样本描述文件和负样本集合文件