1. 程式人生 > >LBS經緯度搜索和距離排序 各種方案

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方案(其中一部分你已經測試了),供你參考: