我有一个用于存储房地产房的NoSQL系统。
我在每个房子的键值存储中获得的一条信息是longitude
和latitude
。
如果我想检索geo-lat / long框中的所有房屋,如下面的SQL:
SELECT * from houses
WHERE latitude IS BETWEEN xxx AND yyy
AND longitude IS BETWEEN www AND zzz
问题:
如何使用NoSQL进行此类检索...仅使用键值存储系统?
即使我能用NoSQL做到这一点,它甚至会有效还是回到使用传统数据库更快地检索这类信息?
答案 0 :(得分:2)
Sql或没有sql不是问题 - 问题是严格来说,你的密钥是什么类型的索引。 spatial indices,这是您有效满足查询所需要的,与Sql无关,甚至与关系数据库无关 - 它们与关系问题和非关系问题完全正交。不幸的是,我不知道Cassandra或其他流行的非关系数据库的任何公开可用的空间索引系统(事实上,我唯一知道的唯一面向GIS的数据库引擎是PostGIS,它恰好是作为强大的开源PostGres ...... 是关系; - )。
如果您没有空间索引但只有一个普通索引(例如,一个按Lat排序,然后是Long),那么您将必须扫描所有具有合适Lat的记录,以丢弃那些不合适的Long - - 正如关系引擎在相同的情况下必须为你做的那样(当你选择几个BETWEEN
时,所有它必须继续下去的是两个字段的明确排序索引,因此受到限制)。与关系无关......与索引有关; - )。
答案 1 :(得分:2)
MongoDB是我所知道的唯一支持地理空间索引的NoSQL数据库。如果您使用的是MongoDB,则应该查看the documentation,但基本上您要创建一个地理空间索引:
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 :(得分:0)
Lucene也有一种名为Local Lucene的东西。可以使用本地Solr通过REST HTTP进行访问:http://www.gissearch.com/geo_search_intro http://wiki.apache.org/solr/SpatialSearch