NoSQL:如何基于纬度和经度检索“房屋”?

4

我有一个用于存储房地产房屋的NoSQL系统。

每个房屋在我的键值存储中都有一些信息,包括经度和纬度。

如果我想检索位于地理经度/纬度框内的所有房屋,就像下面的SQL语句:

SELECT * from houses 
WHERE latitude IS BETWEEN xxx AND yyy
AND longitude IS BETWEEN www AND zzz

问题:

  1. 如果只使用键值存储系统,我该如何使用NoSQL进行此类型的检索?

  2. 即使我可以使用NoSQL完成这项任务,是否高效?还是回到传统数据库会更快地检索此类信息?


取决于你的NoSQL数据库是否具有空间索引。如果有,那么没有问题,否则最好使用支持空间的SQL数据库来处理此问题...但重点是索引,而不是SQL。为什么不将这些信息放入PostGIS中,然后将其余部分留在你的NoSQL解决方案中呢? - Andrew McGregor
不想失礼,但我特别想知道如何使用NoSQL来实现这个...而不是PostGIS(它是一个数据库)。 - Tedk
MongoDB支持地理索引:http://www.mongodb.org/display/DOCS/Geospatial+Indexing - TTT
3个回答

2

MongoDB是我所知唯一支持地理空间索引的NoSQL数据库。如果您正在使用MongoDB,您应该查看文档,但基本上您需要使用以下方法创建地理空间索引:

db.houses.ensureIndex({house : "2d"})

您需要插入如下点:

db.houses.insert({house : {latitude : y, longitude : x}})

然后使用以下查询语句进行查询:

db.houses.find({house : {$within : {$box : [[xxx, yyy], [www, zzz]]}}})

MongoDB还允许您在给定半径内搜索,并仅搜索最接近点的匹配项。

2
Sql或NoSql并不是问题的关键,严格来说,问题在于您的关键字上有什么样的索引。要满足您的查询需求,您需要空间索引,这与Sql甚至更普遍的关系数据库没有任何关系——它们完全与关系和非关系问题无关。不幸的是,我不知道Cassandra或其他流行的非关系型数据库是否有公开可用的空间索引系统(事实上,我所了解的唯一面向GIS的数据库引擎是PostGIS,它恰好是强大的开源PostGres的扩展...它是关系型的;-)。
如果您没有空间索引,只有一个普通的索引(例如,按Lat排序,然后按Long排序),那么您将不得不浏览所有具有合适Lat的记录,以丢弃那些具有不适当Long的记录——就像在相同情况下关系引擎为您做的那样(当您使用一对BETWEEN进行选择时,它所依赖的只是两个受限字段的排序索引)。这与关系性无关,与索引有关; -)。

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接