博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MongoDB 地理位置索引的实现原理
阅读量:2428 次
发布时间:2019-05-10

本文共 804 字,大约阅读时间需要 2 分钟。

支持是MongoDB的一大亮点,这也是全球最流行的LBS服务foursquare 选择MongoDB的原因之一。我们知道,通常的数据库索引结构是B+ Tree,如何将地理位置转化为可建立B+Tree的形式,下文将为你描述。

  首先假设我们将需要索引的整个地图分成16×16的方格,如下图(左下角为坐标0,0 右上角为坐标16,16):

  

  单纯的[x,y]的数据是无法建立索引的,所以MongoDB在建立索引的时候,会根据相应字段的坐标计算一个可以用来做索引的hash值,这个值叫做geohash,下面我们以地图上坐标为[4,6]的点(图中红叉位置)为例。

  我们第一步将整个地图分成等大小的四块,如下图:

  划分成四块后我们可以定义这四块的值,如下(左下为00,左上为01,右下为10,右上为11):

01110010

  这样[4,6]点的geohash值目前为 00

  然后再将四个小块每一块进行切割,如下:

  

  这时[4,6]点位于右上区域,右上的值为11,这样[4,6]点的geohash值变为:0011

  继续往下做两次切分:

  

  

  最终得到[4,6]点的geohash值为:00110100

  这样我们用这个值来做索引,则地图上点相近的点就可以转化成有相同前缀的geohash值了。

  我们可以看到,这个geohash值的精确度是与划分地图的次数成正比的,上例对地图划分了四次。而MongoDB默认是进行26次划分,这个值在建立索引时是可控的。具体建立二维地理位置索引的命令如下:

  db.map.ensureIndex({point : "2d"}, {min : 0, max : 16, bits : 4})

  其中的bits参数就是划分几次,默认为26次。

原文出处:http://blog.nosqlfan.com/html/1811.html
你可能感兴趣的文章
ZABBIX实践(一) 服务端部署和安装
查看>>
ZABBIX实践(二) centos下的Agent端部署和安装
查看>>
Redis实践(二)高可用的集群+哨兵部署
查看>>
CentOs 6.5下java 安装
查看>>
RPC实践(二)JsonRPC实践
查看>>
RPC实践(三)Hessian实践
查看>>
Zookeeper实践(四)zookeeper的WEB客户端zkui使用
查看>>
RPC实践(四)Dubbo实践
查看>>
java对象实例化的几种方法
查看>>
RPC实践(五)Dubbo实践-服务集群
查看>>
java单元测试Junit实践(一) Junit基础
查看>>
Webservice实践(一) Webservice基础和SOAP简单介绍
查看>>
Webservice实践(二)Webservice 客户端开发
查看>>
Webservice实践(三)基于JDK的jax ws进行服务端开发
查看>>
Webservice实践(四)基于AXIS2的服务端开发
查看>>
Webservice实践(五)基于CXF的服务端开发
查看>>
Webservice实践(七)CXF 与Spring结合+tomcat发布
查看>>
Webservice实践(六)CXF拦截器简介
查看>>
Spring实践(一)IOC的原理和实现机制
查看>>
OpenStack 学习笔记(一) 概况
查看>>