Algorithm 如何按位置和日期范围高效地搜索大型数据集?
我有一个MongoDB集合,其中包含以下属性:Algorithm 如何按位置和日期范围高效地搜索大型数据集?,algorithm,search,mongodb,search-engine,geospatial,Algorithm,Search,Mongodb,Search Engine,Geospatial,我有一个MongoDB集合,其中包含以下属性: longitude, latitude, start_date, end_date, price 我有超过5亿份文件 我的问题是如何尽可能高效地按纬度/纬度、日期范围和价格进行搜索? 在我看来,我的选择是: 在lat/long上创建地理空间索引,并使用MongoDB的邻近搜索。。。然后根据日期范围和价格对其进行过滤。 我还没有对此进行测试,但我担心数据量太大,无法快速搜索,因为我们每秒大约搜索一次 您是否了解MongoDB在这种情况下的反应
longitude, latitude, start_date, end_date, price
我有超过5亿份文件
我的问题是如何尽可能高效地按纬度/纬度、日期范围和价格进行搜索?在我看来,我的选择是:
- 我还没有对此进行测试,但我担心数据量太大,无法快速搜索,因为我们每秒大约搜索一次
- 您是否了解MongoDB在这种情况下的反应
- 然后,我必须首先按lat/long进行查询,找到最近的城市集合,然后使用日期和价格过滤器对集合中的子集数据进行MongoDB空间搜索
- 我会有不均衡的文件分发,因为一些城市会比其他城市有更多的文件
- 日期范围跨越多个集合的搜索存在问题
- 同样,我必须使用lat/long查询查找最近的城市,并附加日期范围以访问密钥。这似乎是相当快,但我真的不喜欢城市查找方面。。。看起来有点难看
非常感谢。索引和数据访问性能是一个深刻而复杂的主题。很多因素都会影响最有效的解决方案,包括数据集的大小、读写比、IO和备份存储的相对性能等 虽然我不能给你一个具体的答案,但我可以建议研究使用莫顿数作为提取多个类似数值(如lat-longs)的有效方法
为什么您认为选项1会太慢?这是一个真实世界测试的结果,还是仅仅是一个假设,它最终可能不起作用 MongoDB本机支持地理哈希,并将坐标转换为单个数字,然后通过BTree遍历进行搜索。这应该相当快。在我看来,乱搞多个收藏不是一个好主意。它所做的只是用一些仍然需要编写、测试和维护的代码替换数据库上的一级BTree遍历 不要重新发明轮子,但首先尝试优化最明显的路径(1):
geoNear
(如果可能的话),并坚持使用更快(但不是完美的球形)near
查询太好了,那会很有帮助的。我会做一些调查+这是很好的理论输入。然而,据我所知,geohash是一条Z阶曲线,这就是MongoDB用于其本地地理空间索引的方法。在数据库顶部手动重新构建该数据库不是一个好主意。它还处理边缘情况,并提供许多搜索模式(多边形、球形等)。由于MongoDB不支持按位查询,目前可能根本不可能有效地实现。如果索引正确,第一个解决方案肯定可以与关系数据库(mysql)一起使用。非常感谢您的评论-正如我前面提到的,我还没有在现实生活中测试过任何想法。然而,我正在建立数据集。你肯定是对的,首先应该遵循标准,只有当这不符合预期时,才应该尝试其他方法。所有这些建议的另一个见解是,它促使我重新思考数据的结构。具体来说,我将研究基于日期范围生成id的四叉树。这可以提供一个额外的好处,即允许对日期进行空间搜索。我还将深入研究mongo空间搜索的工作原理。再次感谢。空间搜索超过日期?四叉树只有在至少有两个维度时才有效。我认为四叉树对一维数据没有多大帮助,而一维四叉树就是一个B树。还要注意,MongoId类型已经包含了一个日期戳,如果这是一个问题,它可以改进数据的局部性。