mongodb地理位置索引實現原理

來源:互聯網
上載者:User

地理位置索引支援是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):

 

01 11
00 10

 

這樣[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次。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.