LBS經緯度搜索和距離排序 各種方案

看到最近有好多人陸續收藏、關注這個問題,特來更新一下
建議使用ElasticSearch(https://elastic.co)進行LBS業務功能開發
PostGIS也是不錯的
Redis新版有提供Geocoding,可以嘗試一下

一直在琢磨LBS,期待可以發現更好的方案。現在糾結了。

簡單列舉一下已經瞭解到的方案:
1.sphinx geo索引
2.mongodb geo索引
3.mysql sql查詢
4.mysql+geohash
5.redis+geohash

然後列舉一下需求:
1.實時性要高,有頻繁的更新和讀取
2.可按距離排序支持分頁
3.支持多條件篩選(一個經緯度數據還包含其他屬性,比如社交系統的性別、年齡)

方案簡單介紹:
1.sphinx geo索引
支持按照距離排序,並支持分頁。但是嘗試mva+geo失敗,還在找原因。
無法滿足高實時性需求。(可能是不瞭解實時增量索引配置有誤)
資源佔用小,速度快

2.mongodb geo索引
支持按照距離排序,並支持分頁。支持多條件篩選。
可滿足實時性需求。
資源佔用大,數據量達到百萬級請流量在10w左右查詢速度明顯下降。

3.mysql+geohash/ mysql sql查詢
不支持按照距離排序(代價太大)。支持分頁。支持多條件篩選。
可滿足實時性需求。
資源佔用中等,查詢速度不及mongodb。
且geohash按照區塊將球面轉化平面並切割。暫時沒有找到跨區塊查詢方法(不太瞭解)。

4.redis+geohash
geohash缺點不再贅述
不支持距離排序。支持分頁查詢。不支持多條件篩選。
可滿足實時性需求。
資源佔用最小。查詢速度很快。

網友回覆:

我建議使用PostGIS(Postgresql數據庫的一個變種,增加了GIS擴展):

  • Postgresql本身是最先進的開源RDBMS(沒有之一),是最穩定成熟的RDBMS之一(流行度和社區成熟度比不上MySQL)
  • PostGIS是最成熟,功能最豐富的免費GIS數據庫(沒有之一),只有收費的Oracle和SQL Server(他們都有GIS版)才能與之媲美,MySQL的GIS功能通常不能拿來和它比
  • PostGIS本質上還是數據庫,使用SQL操作,可以滿足你更新頻繁、和其它篩選條件聯合使用的要求
  • 結合postgresql FTS擴展(Full Text Search),不僅可以根據性別、年齡、LBS信息搜索,更可以和模糊關鍵詞搜索聯合起來
  • Postgresql也可以做集羣、複製、高可用

如果你的量實在太大,PostGIS滿足不了你的性能要求,可以考慮用PostGIS做源數據存儲,用Sphinx、Solr/Lucene專門提供搜索,Sphinx和Solr/Lucene都有根據距離搜索的功能,也支持實時增量索引(RealTime Index)

下面這篇文章及評論介紹了很多GIS方案(其中一部分你已經測試了),供你參考:

http://openlife.cc/blogs/2012/august/comparing-open-source-gis-implementations


發佈了38 篇原創文章 · 獲贊 111 · 訪問量 59萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章