圖解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

相關文章
相關標籤/搜索