基于elasticsearch 6.8的地理位置信息查询

 这篇文章主要有以下组成:

  • 基于es完成类似附近好友查询
  • 基于es完成类似某个点在面内或者相交查询

类似附近好友查询

 话不多说,可能大多数人只需要相关的编码文档,而且网上又有很多的curl命令操作,所以这里有通过项目示例直接进行一个编码查询附近好友查询:

  1. 构建mapping文档

    {"point": {"_all": {"enabled": false},"properties": {"id": {"type": "keyword"},"type": {"type": "keyword"},"location": {"type": "geo_point"}}}
    }
    

     如果需要的话可以直接拉过去使用,更改不必要的就可以了,这里是通过spring boot项目构建的,将mapping放置的目录我就在这里不说了.

    • 顺带javaBean

      @Mapping(mappingPath = "/json/poi-mapping.json")
      @Document(indexName = "poi",type = "point",shards = 5,replicas = 0,refreshInterval = "1s",indexStoreType = "fs")
      @NoArgsConstructor
      @AllArgsConstructor
      @Getter
      @Setter
      public class GeoPointBean implements Serializable {private static final long serialVersionUID = 2084886055991558779L;@Id@JSONField(ordinal = 1)private String id;@JSONField(ordinal = 2)@Field(type = FieldType.Keyword)private String type;@GeoPointField@JSONField(ordinal = 3)private Object location;
      }
      

      跟着我这里的样子将mapping加上就可以了,在项目启动时候就会自动生成了

      • 上传数据

        // 判断index 是否存在
        if (!esTemplate.indexExists(GeoPointBean.class)) {esTemplate.createIndex(GeoPointBean.class);esTemplate.putMapping(GeoPointBean.class);
        }
        List<IndexQuery> queries = new ArrayList<>();if (geoPointBeans.size() != geoPointDao.count()) {if (geoPointBeans.size() > 0) {for (GeoPointBean bean : geoPointBeans) {IndexQuery indexQuery =new IndexQueryBuilder().withIndexName("poi").withType("point").withId(bean.getId()).withObject(bean).build();queries.add(indexQuery);// 分批提交索引if (counter % 5000 == 0) {try{esTemplate.bulkIndex(queries);}catch (Exception e){log.error("error------->"+e.getMessage());}queries.clear();log.info("bulkIndex counter : " + counter);}counter++;}}// 不足批的索引最后不要忘记提交if (queries.size() > 0) {esTemplate.bulkIndex(queries);counter += queries.size();}esTemplate.refresh(GeoPointBean.class);log.info("bulkIndex  counter : " + counter);
        } else {counter = 1;log.info("数据无需写入");
        }
        
  2. 进行一个附近好友查询

    //指定 indices和type类型
    SearchRequestBuilder searchRequestBuilderPy = client.prepareSearch("poi").setTypes("point");
    BoolQueryBuilder boolQueryBuilderPy = QueryBuilders.boolQuery();
    GeoDistanceQueryBuilder matchQueryBuilderRegionPy =
    //指定索引字段
    geoDistanceQuery("location")
    //指定查询的点
    .point(point)
    //指定距离,和距离单位
    .distance(distance, DistanceUnit.METERS)
    //排序
    .geoDistance(GeoDistance.ARC);
    boolQueryBuilderPy.must(matchQueryBuilderRegionPy);
    searchRequestBuilderPy.setQuery(boolQueryBuilderPy);
    SearchResponse response = searchRequestBuilderPy.execute().actionGet();
    

     到这里的话就已经完成了附近的人查询.

  3. 基于es完成类似某个点在面内或者相交查询

     如果你看过官方文档的话,应该会知道你按照官网的例子能查询到数据,但是仅限于面或线的实例,那么如果通过一个点来查询,其实很简单就是将一个点构建成一个圆即可,但是这个工作之前还是需要一个改动的,这里贴出来官网一句话,顺便一并贴出如果不加我提到的这个的时候会出现的问题:

    出现的问题
    unsupported_operation_exception: CIRCLE geometry is not supported
    

    其实这个问题是因为,官方例子中对geo_shape类型的实例只是做了一个简单示例,并没有添加对圆的支持.

    其中在官方github中的issue中也提到了这一点,而且也给除了解决方案:

    issue的出处:

    geo_shape query with circle does not work for legacy geo_shape field #49296

    其实官网里也有详细的说明:

    出处

    Indexing approachedit
    GeoShape types are indexed by decomposing the shape into a triangular mesh and indexing each triangle as a 7 dimension point in a BKD tree. This provides near perfect spatial resolution (down to 1e-7 decimal degree precision) since all spatial relations are computed using an encoded vector representation of the original shape instead of a raster-grid representation as used by the Prefix trees indexing approach. Performance of the tessellator primarily depends on the number of vertices that define the polygon/multi-polygon. While this is the default indexing technique prefix trees can still be used by setting the tree or strategy parameters according to the appropriate Mapping Options. Note that these parameters are now deprecated and will be removed in a

 这里给出一个方案:

{"shape": {"_all": {"enabled": false},"properties": {"id": {"type": "keyword"},"geometry": {"type": "geo_shape",//以为tree和strategy赋值之后就能正常进行一个点构建成一个圆查询"tree": "geohash","strategy": "recursive"}}}
}
查询的接口如下
SearchRequestBuilder searchRequestBuilderPy = client.prepareSearch("wkt").setTypes("shape");
BoolQueryBuilder boolQueryBuilderPy = QueryBuilders.boolQuery();GeoShapeQueryBuilder matchQueryBuilderRegionPy = null;
try {matchQueryBuilderRegionPy =geoIntersectionQuery("geometry",//将一个点构建成一个圆new CircleBuilder()//传入点.center(point.getLon(), point.getLat())//构建半径和单位.radius(radius, DistanceUnit.METERS));
} catch (IOException e) {e.printStackTrace();
}

基于elasticsearch 6.8的地理位置信息查询相关推荐

  1. 基于android系统的公交信息查询系统,基于Android平台的智能手机公交信息查询系统的设计与实现...

    摘要: 随着我国城市化经济的飞速发展,公共交通在这一进程中的作用越来越重要.目前,我国城市公共交通的线路和站点越来越多,逐渐形成了一个复杂的公共交通网络.然而,正是因为公交网络的复杂,导致人们无法快速 ...

  2. 模拟非同期运行java_基于JavaME技术的移动终端设备信息查询系统的设计分析.pdf...

    应 用 科 基于 学 J a v a ME技术的移动终端设备信息查询系统的设计分析 鲁俊 ( 泰兴中等专业学校江 苏泰兴2 2 5 4 0 0 ) [ 摘 要] J a v a M E技术开发的移动应 ...

  3. 基于C语言实现的足球信息查询系统 课程报告+项目源码+演示PPT+项目截图

    资源下载地址:https://download.csdn.net/download/sheziqiong/85760375 资源下载地址:https://download.csdn.net/downl ...

  4. 魏永红java课后答案_基于J2ME技术的手机信息查询系统的设计与实现

    基于J2ME技术的手机信息查询系统的设计与实现 魏永红 [期刊名称]<微计算机信息> [年(卷),期]2006(000)04X [摘要]本文以公安系统的应用为例,介绍了如何在基于Java的 ...

  5. python在律师上作中的实例_基于Python的律师信息查询接口调用代码实例

    基于Python的律师信息查询接口调用代码实例代码描述:基于Python的律师信息查询接口调用代码实例 代码平台:聚合数据 #!/usr/bin/python # -*- coding: utf-8 ...

  6. ES地理范围查询第一讲:Java操作地理位置信息(geo_point)

    - 简要介绍 我们知道es支持的数据类型是多种多样的,除了我们常见的几种基本数据类型,它也支持记录位置信息的的数据类型.在es中,记录地理位置信息的数据类型有两种,分别为geo_shap和geo_po ...

  7. 简单航班查询系统java_基于jsp的航班信息查询-JavaEE实现航班信息查询 - java项目源码...

    基于jsp+servlet+pojo+mysql实现一个javaee/javaweb的航班信息查询, 该项目可用各类java课程设计大作业中, 航班信息查询的系统架构分为前后台两部分, 最终实现在线上 ...

  8. 医院医生评价的java代码_基于JAVA的医院信息查询接口调用代码实例

    基于JAVA的医院信息查询接口调用代码实例 import java.io.BufferedReader; import java.io.DataOutputStream; import java.io ...

  9. 基于android的旅游信息查询系统APP(ssm+uinapp+Mysql)

    网络的广泛应用给生活带来了十分的便利.所以把旅游信息查询管理与现在网络相结合,利用java技术建设基于安卓的旅游信息查询系统,实现旅游信息查询的信息化.则对于进一步提高旅游信息查询管理发展,丰富旅游信 ...

最新文章

  1. sublime Text 开发工具
  2. 绝对定位right:0;无效_CSS定位详解
  3. 重置SQLSERVER表的自增列,让自增列重新计数
  4. oracle数据库path,利用Path环境变量解决oracle数据库和owb工具不兼容问题!
  5. php gdk,gdk.php
  6. Windows Mobile系统弹出输入法时,自动调整窗口显示
  7. HIVE 一行转多行输出办法
  8. 上海石库门建筑群中规模最大的张园 迎来历史性的“重生”
  9. 使用MagicRecon在挖洞时最大化数据收集量
  10. 追求神乎其技的程式设计之道
  11. ORL人脸识别tensorflow实现
  12. 爬虫初识(爬取dytt电影列表及下载地址)
  13. 12代酷睿不再“挤牙膏”,能为英特尔vPro远程办公带来什么?
  14. 数据结构考研复习(详细指导)(持续更新中)
  15. 【Android探索】基于OpenCV的微液滴粒径分析APP
  16. oracle中的start with connect by用法
  17. 微信小程序实现五星评分效果
  18. OSChina 周日乱弹 —— 怎样判别你是她的男神
  19. 脱离文档流的三种方法
  20. 前HP大中华区总裁孙振耀退休感言

热门文章

  1. 全国计算机高新技术考试证书有什么作用?
  2. 基于胎压监测传感器的TPMS双向通信系统设计
  3. 当前有那些胎压监测芯片,您知道吗?--TPMS芯片
  4. torch学习二之nn.Convolution
  5. Python基础教程(学习笔记整理DAY3)
  6. swift 尾随闭包
  7. numpy三维batch矩阵相乘
  8. 【C语言】结构体排序
  9. Tableau 重新认识购物篮分析(SQL版)
  10. OKHttp使用详解 (B)