NoSQL:如何基于lat& amp检索“房子”长?

时间:2010-05-09 04:20:50

标签: sql database rdbms nosql cassandra

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

我在每个房子的键值存储中获得的一条信息是longitudelatitude

如果我想检索geo-lat / long框中的所有房屋,如下面的SQL:

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

问题:

  1. 如何使用NoSQL进行此类检索...仅使用键值存储系统?

  2. 即使我能用NoSQL做到这一点,它甚至会有效还是回到使用传统数据库更快地检索这类信息?

3 个答案:

答案 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