如何使用 NoSQL 大规模运行地理空间查询?

Posted

技术标签:

【中文标题】如何使用 NoSQL 大规模运行地理空间查询?【英文标题】:How do I run geospatial queries at scale with NoSQL? 【发布时间】:2014-06-09 13:18:47 【问题描述】:

我正准备构建一个 android/ios 应用程序,该应用程序需要我进行复杂的多边形和包含地理空间查询。我喜欢 Apache Cassandra 的无单点故障、容错和数据中心意识。 Cassandra 不直接支持地理空间查询(我知道),但 MongoDB 和 Couchbase Server 支持。 MongoDB 存在扩展问题,我不确定 Couchbase 是否会比带有 Solr 或 Elasticsearch 的 Cassandra 更好。

在 Couchbase 服务器上使用 Datastax Enterprise (DSE)、Cassandra 和 Elasticsearch 会犯错吗?使用 Cassandra/ES 后端与 Couchbase 的网页的加载时间是否会有明显差异?

【问题讨论】:

您在这里提出了一系列问题,其中一些与其他问题 (***.com/questions/22868588/…) 重复,其中一些“主要基于意见”。您是否寻找过其他类似的 SO 问题? 用Cassandra可以成功吗? 可以用 Cassandra 完成吗?可能,是的。是否可以使用其他技术更轻松和/或更有效地完成?这取决于你的技能。 你有什么推荐的? @starjamz 我不知道您的项目范围和要求,也不知道您的团队技能或首选的工作方式,所以我无法向您推荐任何东西。 【参考方案1】:

Aerospike 刚刚发布了 Server Community Edition 3.7.0,其中包含地理空间索引作为一项功能。

Aerospike 现在可以存储 GeoJSON 对象并执行各种查询,允许应用程序跟踪快速变化的地理空间对象或简单地询问“我附近有什么”的问题。在内部,我们使用 Google 的 S2 库和 Geo Hashing 对这些点和区域进行编码和索引。支持以下类型的查询:

区域内的点 半径内的点 点所在的区域

这可以与用户定义的函数 (UDF) 结合以过滤结果 - 即,进一步细化结果以仅包括您附近的酒吧、餐馆或宗教场所 - 即使是当前营业或可用的.此外,例如,找到一个点所在的区域允许广告商找出移动用户所在的活动区域,从而放置一个地理空间定位的广告。在内部,使用了相同的存储机制,可以对地理空间数据或记录中保存的其他数据进行高度并发的读取和写入。地理空间数据非常有趣,因此我们提供了一组基于 Open Street Map 和 Yelp Dataset Challenge 数据的示例。

地理空间是 3.7.0 版本中的一项实验性功能。它旨在供开发人员试用并提供反馈。我们认为 API 很好,但是在一个实验性功能中,根据社区的反馈,Aerospike 可能会选择在此功能 GA 时修改这些 API。它现在不适合生产使用(尽管我们知道一些开发人员会直接进入生产......)

【讨论】:

我认为地理空间索引现在包含在 Aerospike 的标准版本中。我现在将其作为支持地理空间数据的应用程序的参与系统运行。 没错。随着 2016 年 4 月 Aerospike 服务器 v3.8.1 的发布,地理空间功能变得普遍可用 (GA):aerospike.com/blog/aerospike-3-8-release【参考方案2】:

Aerospike 提供了经过验证的高度可扩展的 NoSQL 解决方案。最近添加了地理空间查询,早期采用者版本刚刚发布为announced。您可能想检查一下。

【讨论】:

【参考方案3】:

Redis 可能是最好的选择之一。目前你需要使用 Redis Unstable 3.2。表现非常出色。我一直在用 lettuce java 客户端使用它,并且看到了令人难以置信的结果。半径越大,性能会下降。

http://redis.io/commands/geohash

【讨论】:

一天晚上我在工作中使用了 Redis 和 SpringBoot,它不是一个真正的数据库。 Regis 本质上是一个数据结构服务器,速度很快,但我相信 Aerospike 更快。【参考方案4】:

正如已经指出的那样,您问了很多问题。提供的链接为如何使用 Cassandra 实现通用地理空间操作提供了一个潜在的答案。我将使用直接开箱即用的 Cassandra 构造提供一种可能的答案。

    使用geohashes(或quad trees)或类似的东西,创建geohashes 及其相关多边形的索引。具体关系和精度级别取决于您的数据集和用例。

    要确定哪些多边形与给定点或多边形相交,首先计算其 geohash(es),然后在索引中查找这些 geohash。对于一般的接近,这可能就足够了。无论哪种方式,这都会将潜在的交叉点缩小到一个可管理的集合。

【讨论】:

好的,我找到了自己问题的答案,一个好的解决方案是 Aerospike。 Aerospike 是一种内存计算 (IMC)、键/值 (NoSQL) 数据库,可异步写入固态磁盘 (SSD)。 Aerospike 拥有其 IMC 数据库的一个版本,其中包括地理空间索引,并在测试版中支持快速地理空间查询。我现在已经在我的 AWS 账户上安装了这个数据库。 aerospike.com @Louisrr 你还满意吗?我面临着同样的问题(并且考虑到相同的数据库 - 没有听说过 aerospike)。 抱歉,回复时间过长。是的 Aerospike 3.8+ 是可靠的,包括用于进行大规模地理空间查询的地理空间索引。如果您需要低于 10 毫秒的响应时间,请使用 Aerospike 和 C、GO、Node 或 C++ 等快速服务器技术 (Seastar)

以上是关于如何使用 NoSQL 大规模运行地理空间查询?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 2.1 MongoDB C# 驱动程序中使用地理空间查询?

如何使用 SQL 查询将值传递给具有空间/地理数据类型的存储过程

如何使用sqlserver 2012 空间查询(geometry及 geography)

地理空间索引的划分查询

如何在国家/地区最近的城市内使用 MongoDB 地理空间查询搜索文档?

如何在 MongoDB Java 中编写地理空间查询