图解MongoDB地理位置索引的实现原理

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

  首先假设咱们将须要索引的整个地图分红16×16的方格,以下图(左下角为坐标0,0 右上角为坐标16,16):sql

  

 

  单纯的[x,y]的数据是没法创建索引的,因此MongoDB在创建索引的时候,会根据相应字段的坐标计算一个能够用来作索引的hash值,这个值叫作geohash,下面咱们以地图上坐标为[4,6]的点(图中红叉位置)为例。mongodb

  咱们第一步将整个地图分红等大小的四块,以下图:数据库

 

  划分红四块后咱们能够定义这四块的值,以下(左下为00,左上为01,右下为10,右上为11):nosql

 

01 11
00 10

 

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

  而后再将四个小块每一块进行切割,以下:htm

  

 

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

  继续往下作两次切分:索引

  

 

  

 

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

  这样咱们用这个值来作索引,则地图上点相近的点就能够转化成有相同前缀的geohash值了。

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

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

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

原文出处:http://blog.nosqlfan.com/html/1811.html

相关文章
相关标签/搜索