Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 如何按位置和日期范围高效地搜索大型数据集?_Algorithm_Search_Mongodb_Search Engine_Geospatial - Fatal编程技术网

Algorithm 如何按位置和日期范围高效地搜索大型数据集?

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在这种情况下的反应

我有一个MongoDB集合,其中包含以下属性:

longitude, latitude, start_date, end_date, price
我有超过5亿份文件

我的问题是如何尽可能高效地按纬度/纬度、日期范围和价格进行搜索?
在我看来,我的选择是:

  • 在lat/long上创建地理空间索引,并使用MongoDB的邻近搜索。。。然后根据日期范围和价格对其进行过滤。
    • 我还没有对此进行测试,但我担心数据量太大,无法快速搜索,因为我们每秒大约搜索一次
    • 您是否了解MongoDB在这种情况下的反应
  • 按位置将数据拆分为多个集合。i、 e.由伦敦、巴黎、纽约等城市发行。
    • 然后,我必须首先按lat/long进行查询,找到最近的城市集合,然后使用日期和价格过滤器对集合中的子集数据进行MongoDB空间搜索
    • 我会有不均衡的文件分发,因为一些城市会比其他城市有更多的文件
  • 按日期而不是位置创建集合。同上,但每个文档都根据其日期范围分配一个集合。
    • 日期范围跨越多个集合的搜索存在问题
  • 根据每个文档的城市\开始\日期\结束\日期创建唯一ID。
    • 同样,我必须使用lat/long查询查找最近的城市,并附加日期范围以访问密钥。这似乎是相当快,但我真的不喜欢城市查找方面。。。看起来有点难看
  • 我正在尝试选项1。)但在我走得太远之前,真的想听听你的想法吗

    搜索引擎如何分割和管理他们的数据。。。这一定是类似的问题

    另外,我不必使用MongoDB,我还可以选择其他选项吗


    非常感谢。

    索引和数据访问性能是一个深刻而复杂的主题。很多因素都会影响最有效的解决方案,包括数据集的大小、读写比、IO和备份存储的相对性能等

    虽然我不能给你一个具体的答案,但我可以建议研究使用莫顿数作为提取多个类似数值(如lat-longs)的有效方法


    为什么您认为选项1会太慢?这是一个真实世界测试的结果,还是仅仅是一个假设,它最终可能不起作用

    MongoDB本机支持地理哈希,并将坐标转换为单个数字,然后通过BTree遍历进行搜索。这应该相当快。在我看来,乱搞多个收藏不是一个好主意。它所做的只是用一些仍然需要编写、测试和维护的代码替换数据库上的一级BTree遍历

    不要重新发明轮子,但首先尝试优化最明显的路径(1):

  • 设置地理索引
  • 用于确保查询实际使用索引
  • 确保索引适合RAM
  • 使用
  • 不要在“冷”系统上测量性能,因为该系统的索引还没有机会进入RAM
  • 如果可能,尽量不要使用
    geoNear
    (如果可能的话),并坚持使用更快(但不是完美的球形)
    near
    查询
  • 如果您仍在达到极限,请查看如何将读写分发到多台计算机

  • 太好了,那会很有帮助的。我会做一些调查+这是很好的理论输入。然而,据我所知,geohash是一条Z阶曲线,这就是MongoDB用于其本地地理空间索引的方法。在数据库顶部手动重新构建该数据库不是一个好主意。它还处理边缘情况,并提供许多搜索模式(多边形、球形等)。由于MongoDB不支持按位查询,目前可能根本不可能有效地实现。如果索引正确,第一个解决方案肯定可以与关系数据库(mysql)一起使用。非常感谢您的评论-正如我前面提到的,我还没有在现实生活中测试过任何想法。然而,我正在建立数据集。你肯定是对的,首先应该遵循标准,只有当这不符合预期时,才应该尝试其他方法。所有这些建议的另一个见解是,它促使我重新思考数据的结构。具体来说,我将研究基于日期范围生成id的四叉树。这可以提供一个额外的好处,即允许对日期进行空间搜索。我还将深入研究mongo空间搜索的工作原理。再次感谢。空间搜索超过日期?四叉树只有在至少有两个维度时才有效。我认为四叉树对一维数据没有多大帮助,而一维四叉树就是一个B树。还要注意,MongoId类型已经包含了一个日期戳,如果这是一个问题,它可以改进数据的局部性。